廣播小結

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 注意點

  • 本地廣播是無法通過靜態註冊的方式來接收的;
  • 可以明確地知道正在發送的廣播不會離開我們的程序,因此不需要擔心機密數據泄漏的問題;
  • 其他的程序無法將廣播發送到我們程序的內部,因此不需要擔心會有安全漏洞的隱患;
  • 發送本地廣播比起發送系統全局廣播將會更加高效;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章