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 {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);
}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.activity_main, menu);return true;}}
靜態註冊和動態註冊
寫好BroadcastReceiver 之後要對其進行註冊。
靜態註冊需要修改manifest檔案,也是我採用的方法。
添加
<receiver android:name=".NetworkStateReceiver" > <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver>
動態註冊的話需要這樣做(未調試):
1. 在Activity的onCreate中:
//註冊網路監聽
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(mNetworkStateReceiver, filter);
2. 在Activity中的onDestroy中:
//取消監聽
unregisterReceiver(mNetworkStateReceiver);
最終效果:
參考:
基礎總結篇之五:BroadcastReceiver應用詳解-http://blog.csdn.net/liuhe688/article/details/6955668