国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android中BroadcastReceiver(異步接收廣播Intent)的使用

2020-04-11 12:39:03
字體:
來源:轉載
供稿:網友
Broadcast Receiver簡介
Broadcast Receiver是Android的五大組件之一,使用頻率也很高。
用于異步接收廣播Intent,廣播Intent的發送是通過調用Context.sendBroadcast()、廣播接收者(BroadcastReceiver)用于異步接收廣播Intent,廣播Intent的發送是通過調用Context.sendBroadcast()、Context.sendOrderedBroadcast()或者Context.sendStickyBroadcast()來實現的。通常一個廣播Intent可以被訂閱了此Intent的多個廣播接收者所接收,廣播接收者和JMS中的Topic消息接收者很相似.
廣播接收器只能接收廣播,對廣播的通知做出反應,很多廣播都產生于系統代碼.如:時區改變的通知,電池電量不足、用戶改變了語言偏好或者開機啟動等.
廣播接收器沒有用戶界面,但是,它可以為它們接收到信息啟動一個Activity或者使用NotificationManager來通知用戶.
生命周期
一個BroadcastReceiver 對象只有在被調用onReceive(Context, Intent)的才有效的,當從該函數返回后,該對象就無效的了,結束生命周期。
因此從這個特征可以看出,在所調用的onReceive(Context, Intent)函數里,不能有過于耗時的操作,不能使用線程來執行。對于耗時的操作,請start service來完成。因為當得到其他異步操作所返回的結果時,BroadcastReceiver 可能已經無效了。
監聽網絡狀態變化的例子
下面通過一個例子來使用BroadcastReceiver。
NetworkStateReceiver:接收網絡狀態變化時系統發出的Broadcast。
復制代碼 代碼如下:

package com.example.networkbroadcastreceiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
import android.widget.Toast;
public class NetworkStateReceiver extends BroadcastReceiver {
private static final String TAG = "NetworkStateReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "network state changed.");
if (!isNetworkAvailable(context)) {
Toast.makeText(context, "network disconnected!", 0).show();
}
else Toast.makeText(context, "network connected!", 0).show();
}
/**
* 網絡是否可用
*
* @param context
* @return
*/
public static boolean isNetworkAvailable(Context context) {
ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo[] info = mgr.getAllNetworkInfo();
if (info != null) {
for (int i = 0; i < info.length; i++) {
if (info[i].getState() == NetworkInfo.State.CONNECTED) {
return true;
}
}
}
return false;
}
}

MainActivity:
復制代碼 代碼如下:

package com.example.networkbroadcastreceiver;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

靜態注冊和動態注冊
寫好BroadcastReceiver 之后要對其進行注冊。
靜態注冊需要修改manifest文件,也是我采用的方法。
添加
復制代碼 代碼如下:

<SPAN style="FONT-SIZE: 14px"><receiver android:name=".NetworkStateReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver></SPAN>

動態注冊的話需要這樣做(未調試):
1. 在Activity的onCreate中:
//注冊網絡監聽
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(mNetworkStateReceiver, filter);
2. 在Activity中的onDestroy中:
//取消監聽
unregisterReceiver(mNetworkStateReceiver);
最終效果:
 
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 浮梁县| 军事| 新郑市| 微博| 苏尼特右旗| 东丰县| 大英县| 南京市| 西藏| 长春市| 天峨县| 通化市| 盱眙县| 平罗县| 邯郸县| 泊头市| 张北县| 响水县| 乐山市| 冀州市| 乌鲁木齐市| 安多县| 宜都市| 饶阳县| 仪征市| 商丘市| 搜索| 汽车| 外汇| 裕民县| 新民市| 灵璧县| 五华县| 茶陵县| 木兰县| 河北省| 湘乡市| 广州市| 沧州市| 冀州市| 新晃|