1 分類及區別
分類一:
- 標準廣播(Normal broadcasts):完全異步;沒任何先後順序;不能攔截;
- 有序廣播(Ordered broadcasts):同步執行;有先後順序;可以攔截(後續接收的還是最開始傳遞的);
分類二:
- 系統廣播:全局廣播;
- 自定義廣播:全局廣播;
- 本地廣播:非全局廣播,即只有本程序內部使用。
2 接收系統廣播
1 動態註冊
在代碼中註冊
//在需要註冊的地方調用
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
//BroadcastReceiver的實例對象,繼承之即可,裏面編寫需要實現的業務邏輯
networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver, intentFilter);
//動態註冊的廣播接收器一定都要取消註冊纔行
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(networkChangeReceiver);
}
//記得添加權限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
動態註冊的廣播接收器可以自由地控制註冊與註銷,在靈活性方面有很大的優勢,但是
它也存在着一個缺點,即必須要在程序啓動之後才能接收到廣播,因爲註冊的邏輯是在
程序啓動後才能執行的。那麼有沒有什麼辦法可以讓程序在未啓動的情況下就能接收到廣播
呢?這就需要使用靜態註冊的方式了。
2 靜態註冊
在AndroidManifest.xml中註冊
//添加權限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver android:name=".BootCompleteReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
需要注意的是,不要在onReceive()方法中添加過多的邏輯或者進行任何的耗時操作,因爲在廣播接收器中是不允許開啓線程的.
3 使用
1 發送自定義標準廣播
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
2 發送自定義有序廣播
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendOrderedBroadcast(intent, null);//第二個是優先級,傳入null即可
<receiver android:name=".MyBroadcastReceiver">
<intent-filter android:priority="100" >//這裏設置了優先級
<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
這樣就可以在接收器中使用如下代碼來實現廣播的攔截,後續的廣播不再接收。
abortBroadcast();
3 本地廣播的使用
主要通過LocalBroadcastManager這個類實現。
1 實現
與動態註冊廣播大體相同(xml文件不用操作):
//第一步:獲取實例
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
//第三步:發送本地廣播
localBroadcastManager.sendBroadcast(intent);
}
});
intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
// 第二步:註冊本地廣播監聽器
localBroadcastManager.registerReceiver(localReceiver, intentFilter);
...
//第四步:取消註冊
localBroadcastManager.unregisterReceiver(localReceiver);
2 注意點
- 本地廣播是無法通過靜態註冊的方式來接收的;
- 可以明確地知道正在發送的廣播不會離開我們的程序,因此不需要擔心機密數據泄漏的問題;
- 其他的程序無法將廣播發送到我們程序的內部,因此不需要擔心會有安全漏洞的隱患;
- 發送本地廣播比起發送系統全局廣播將會更加高效;