廣播接收器(Broadcast Receiver)
标準廣播(Normal Broadcasts)完全異步的廣播。廣播發出後,所有的廣播接收器幾乎同時接收到這條廣播
有序廣播(Ordered Broadcasts)同步廣播。同一時刻隻有一個廣播接收器能接收到這條廣播。這個接收器處理完後,廣播才會繼續傳遞。
注冊廣播。在代碼中注冊稱為動态注冊。在AndroidManifest.xml中注冊稱為靜态注冊。動态注冊的剛波接收器一定要取消注冊。在onDestroy()方法中調用unregisterReceiver()方法來取消注冊。
建立廣播接收器:調用onReceive()方法,需要一個繼承BroadcastReceiver()的類。
不要在onReceive()方法中添加過多的邏輯操作或耗時的操作。因為在廣播接收器中不允許開啟線程,當onReceive()方法運作較長時間而沒結束時,程式會報錯。是以廣播接收器一般用來打開其他元件,比如建立一條狀态欄通知或啟動一個服務。
标準廣播
建立一個MyExampleReceiver繼承自BroadcastReceiver。
public class MyExampleReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent){
Toast.makeText(context,"Got it",Toast.LENGTH_SHORT).show();
//abortBroadcast();
}
}
abortBroadcast();可以截斷有序廣播
在AndroidManifest.xml中注冊廣播接收器;name裡填接收器的名字。
可以設定廣播接收器優先級:<intent-filter android:priority="100">
<receiver android:name=".MyExampleReceiver">
<intent-filter>
<action android:name="com.rust.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
讓接收器接收到一條“com.rust.broadcasttest.MY_BROADCAST”廣播。
發送自定義廣播(标準廣播)時,要傳送這個值。例如:
Intent intent = new Intent("com.rust.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
發送有序廣播,應當調用sendOrderedBroadcast();
Intent intent = new Intent("com.rust.broadcasttest.MY_BROADCAST");
sendOrderedBroadcast(intent,null);
本地廣播
廣播隻能在應用程式内部進行傳遞,并且廣播接收器也隻能接收到來自本應用程式發出的廣播。
本地廣播無法靜态注冊。比全局廣播更加高效。
用LocalBroadcastManager管理廣播。将其執行個體化getInstance(),調用發送廣播和注冊廣播接收器的方法。
--> sendBroadcast();--> registerReceiver();
在配置檔案中聲明權限,程式才能通路一些關鍵資訊。
例如允許查詢系統網絡狀态。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
機器開機廣播
<uses-permission android:name="android.permission.BOOT_COMPLETED">
允許一個程式打開視窗使用 TYPE_SYSTEM_ALERT,顯示在其他所有程式的頂層
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
如果沒有申請這些權限,程式有可能會意外關閉。并彈出對話框。