類型
Android中的廣播主要分爲兩類:標準廣播和有序廣播。
- 標準廣播是一種完全異步執行的廣播,發出後所有廣播接收器幾乎同時接收到這條廣播,該類型廣播無法被截斷。
- 有序廣播是一種同步執行的廣播,在廣播發出後同一時刻只有一個廣播接收器能夠接收到這條廣播消息。優先級高的廣播接收器先收到廣播消息,並能截斷正在傳遞的廣播。
接收廣播
註冊方式分兩種:在代碼中註冊(動態註冊)以及在AndroidManifest.xml中註冊(靜態註冊)
動態註冊
- 創建一個廣播接收器類,繼承於BroadcastReceiver,並重寫父類的onReceive()方法。
- 創建一個intentFilter實例,併爲其添加相應地action(想要監聽什麼廣播,就添加相應的action)
- 最後調用registerReceiver(BroadcastReceiver receiver, IntentFilter intentFilter)方法完成註冊。
- 動態註冊的廣播接收器一定要取消註冊,unregisterReceiver()
若涉及一些敏感操作,則需在配置文件中聲明權限纔可以,如< uses-permission android:name=”android.permission.ACCESS_NETWORK_STATE”/>
靜態註冊
- 同動態註冊第1步,創建一個廣播接收器類
- 在AndroidManifest中註冊,示例:
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<actoin android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
android.intent.action.BOOT_COMPLETED爲系統開機完成後發出的一條廣播
發送廣播
發送標準廣播
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
發送有序廣播
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendOrderedBroadcast(intent, null);
可見有序廣播和標準廣播只有一行差別。sendOrderedBroadcast()接收兩個參數,第一個仍是Intent,第二個參數是一個與權限相關的字符串。
而接收器的優先級相關設置如下:
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="100">
<actoin android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
優先級高的廣播接收器可以先收到廣播,調用abortBroadcast()方法可以將廣播截斷,後面的廣播接收器將無法再接收到這條廣播。
使用本地廣播
- 本地廣播是無法通過靜態註冊的方式來接收的。
- 本地廣播不會離開我們的程序,不必擔心機密數據泄露
- 其他的程序無法將廣播發送到我們程序的內部
- 發送本地廣播比發送系統全局廣播更高效。
用法:主要使用一個LocalBroadcastManager來對廣播進行管理。如:
LocalBroadcastManager localBroadcastManager;
localBroadcastManager = LocalBroadcastManager.getInstance(this);
//發送本地廣播
Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent);
//註冊接收本地廣播
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
LocalReceiver localReceiver = new LocalReceiver();//先定義好LocalReceiver類
localBroadcastManager.registerReceiver(localReceiver, intentFilter);