重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
Broadcast Receiver包含兩部分功能: 發送和接收廣播消息
調用sendBroadCast()方法發送廣播,即發送一個Intent
發送廣播只能啟動廣播接收器Receiver對象
接收廣播Receiver,它和Activity、Service在架構上是平等的
Receiver沒有界面,其生命周期非常短,在執行onReceive()方法中才有效,一旦onReceive()
方法執行完畢,該Receiver的生命期就結束,。
廣播消息分為兩類: 系統定義的一些廣播消息和自定義廣播消息
接收消息的方式:
靜態接收:當程序安裝時就聲明其內部的廣播接收器
動態接收:通過調用registerReceiver()方法向系統注冊一個Receiver,動態接收多用于一個應用程序的內部
每個接收器(Receiver)內部都有一個onReceive()方法
2.廣播消息的方式同步廣播和異步廣播
![]() | ||
![]() |
廣播的分類
普通廣播(Normal Broadcast):是完全異步的,可以在同一時刻(邏輯上)被所有接收者接收到,消息傳遞的效率比較高。但缺點是接收者不能將處理結果傳遞給下一個接收者,并且無法終止Broadcast Intent的傳播。
有序廣播(Ordered Broadcast):該廣播的接收者將按預先聲明的優先級依次接收廣播。有序廣播接收者可以終止廣播的傳播(通過調用abortBroadcast()方法),廣播的傳播一旦終止,后面的接收者就無法接收到廣播。另外,廣播的接收者可以將數據傳遞給下一個接收者(通過setResultExtras(Bundle bundle)方法)。
3.廣播實例發送廣播sendBroadcast(intent)
接收廣播。四大組件之一---廣播接收者Broadcast Receiver。
類似于事件處理。不過事件處理是同一個程序內部,而廣播的處理機制則是系統級別的(可用于不同應用程序之間)。
實現方式為:寫個類繼承BroadcastReceiver,覆蓋方法onReceive()
在配置文件中配置
step1.寫一個類繼承BroadCastReceiver,重寫onReceive()方法
step2.在AndroidManifest.xml中注冊廣播(稱為靜態注冊)
動態注冊:
@Override
protected void onStart() {
super.onStart();
receiver= new MyReceiver();
IntentFilter filter= new IntentFilter();
filter.addAction("com.anjoyo.receiver");
registerReceiver(receiver, filter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
step3.發送廣播
隱式通過action找到相應的receiver組件
Intent intent = new Intent("com.anjoyo.receiver");
sendBroadcast(intent);
顯示通過類名找到本程序的receiver組件
Intent intent = new Intent(context,MyReceiver.class);
sendBroadcast(intent);
Receiver例子代碼:
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent intent2= new Intent("com.anjoyo.activity");
intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent2);
}
}
Activity配置:
同步方式發送(sendOrderBroadcastReceiver(intent))的廣播,如何注冊廣播接收器的優先級?通過給
值越大優先級越高。
注意:
每次系統廣播(Broadcast)事件發生后,系統就會創建對應的BroadcastReceiver實例,并自動觸發它的onReceive()方法,onReceive()方法執行完后,BroadcastReceiver的實例就會被銷毀。
如果BroadcastReceiver的onReceive()方法不能在10秒內執行完成,Android會認為該程序無響應。所以不要在廣播接收者的onReceive()方法里執行一些耗時的操作,否則會彈出ANR(Application No Response)的對話框。
動態注冊:
動態創建Receiver
不需要在xml文件中聲明該Receiver
需要調用registerReceiver()方法向應用程序的Context注冊
receiver = new MyReceiver();
IntentFilter filter= new IntentFilter();
filter.addAction("com.anjoyo.receiver");
registerReceiver(receiver, filter);
一般在程序的onPause()方法中調用unregisterReceiver()以注銷Receiver對象
unregisterReceiver(receiver);
如果沒有注銷Receiver,那么該Receiver會一直處于接收廣播消息就緒的狀態,直到該程序的Context被銷毀
監聽系統開機廣播android.intent.action.BOOT_COMPLETED(可以用來設置開機啟動項)代碼實現:接收到開機事件后BroadcastReceiver啟動一個Activity作為響應
1.寫一個類繼承BroadReceiver,實現OnReceiver方法
public class MyReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Intent intent= new Intent(context,MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
}
2.完成MainActivity
3.在AndroidManifest.xml配置
訪問系統開機事件的權限: