四大組件之廣播
大綱
- 廣播機制簡介
- 廣播接收器
- 廣播發信器
- 接收系統廣播
- 發送自定義廣播
- 本地廣播
#廣播機制簡介
Android 中的每個應用程序都可以對自己感興趣的廣播進行注冊,注冊了的廣播發出廣播消息后應用程序就會收到并執行自定義邏輯。
#廣播接收器 需要注冊
廣播接收者簡單地說就是接收廣播意圖的Java類,此Java類繼承BroadcastReceiver類。
重寫:public void onReceive(Context context,Intent intent)方法。其中 intent 可以獲得傳遞的數據
廣播意圖
通過Context.sendBroadcast(Intent intent)或Context.sendOrderedBroadcast(Intent intent)發送的意圖。
發信方在 Intent 設置
action="com.my_broadcast"
收信方在 AndroidManifest.xml中設置 也可以使用動態注冊
<action android:name="com.my_broadcast"/>
通過設置的action值,發信方能夠廣播給所有滿足條件的廣播接收器
#廣播發信器
通常廣播發送方就是調用
Context.sendBroadcast()
,sendOrderedBroadcast
的程序。
通常廣播發送方都是通過隱式意圖,這樣才能發送給多人。
##廣播分類
-
標準廣播
Normal broadcasts
:異步執行,廣播發出后所有 接收器 幾乎同時接收到廣播信息,并同時執行 接收器的邏輯。標準廣播無法截斷。 -
有序廣播
Ordered broadcasts
:同步執行,廣播發出后同時只有一個 接收器 能接收到信息 按照優先級順序最高1000
,當 接收器執行完邏輯 之后這條廣播才會繼續往下傳遞。可以截斷。截斷廣播后,后續的廣播接收器就接不到這條廣播了
#接收系統廣播接收廣播需要注冊
動態注冊 IntentFilter
廣播接收器的創建:繼承 BroadcastReceiver 類并重寫 onReceiver() 方法。
onReceiver() 方法:接收到廣播后回調該方法。
##動態注冊
注冊廣播:registerReceiver(BroadcastReceiver 廣播接收器對象, intentFilter);
注銷廣播:unregisterReceiver(BroadcastReceiver 廣播接收器對象);
// 想要接收什么廣播就添加響應的 action
IntentFilter intentFilter = new IntentFilter("com.cheng.broadcast.MY_BROADCAST");
// 自定義廣播接收器
MyBroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver();
// 注冊廣播
registerReceiver(myBroadcastReceiver, intentFilter);
##靜態注冊
在
AndroidMainfest
文件中注冊廣播接收器
<application
...>
<receiver
android:name=".receiver.MyBroadcastReceiver"
android:enbled="true" // 是否啟用這個廣播接收器
android:exported="true" // 是否允許這個廣播計算器接收外部程序發出的廣播
>
<intent-filter
android:priority="100"> // 接收器的優先級
<action android:name="actionValue"/> // 監聽的廣播
</intent-filter>
</receiver>
</application>
#發送廣播
##標準廣播
發出:sendBroadcast(Intent intent);
##有序廣播
發出:sendOrderedBroadcast(Intent intent, String 權限字符串
null即可
);
截斷:abortBroadcast();
// 發出一條廣播
Intent intent = new Intent("com.cheng.broadcast.MY_BROADCAST");
sendOrderedBroadcast(Intent intent, null);
#本地廣播
本地廣播只能在應用程序內部傳遞。
LocalBroadcastManager 類:本地廣播管理器
注冊/注銷本地廣播需要用到此類
localBroadcastManager.registerReceiver
(BroadcastReceiver 廣播接收器對象, intentFilter):注冊本地廣播
localBroadcastManager.unregisterReceiver
(BroadcastReceiver 廣播接收器對象):注銷本地廣播
##使用本地廣播 動態注冊 IntentFilter
...
// 獲取管理器實例
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
// 注冊廣播
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.cheng.broadcast.MY_BROADCAST");
// 自定義廣播接收器類 與系統廣播接收器是一樣的 用LocalBroadcastManager注冊后就只能接收本地廣播了
LocalReceiver localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver, intentFilter);
// 發送廣播
Intent intent = new Intent("com.cheng.broadcast.MY_BROADCAST");
LocalBroadcastManager.sendBroadcast(intent);
#總結
廣播發信器
調用Context.sendBroadcast()的程序
廣播接收器
繼承 BroadcastReceiver 類
接收到廣播后執行:onReceiver() 方法
注冊廣播:registerReceiver(廣播接收器, intentFilter);
注銷廣播:unregisterReceiver(廣播接收器);
本地廣播
LocalBroadcastManager 對象來注冊與注銷接收器
LocalBroadcastManager.getInstance(Context):獲取實例
注意
onReceive方法必須在10秒內完成,如果沒有完成,則拋'Application No Response'。
當廣播接收者onReceive方法需要執行很長時間時,最好將此耗時工作通過Intent發送給Service,由Service完成。并且不能使用子線程解決,因為BroadcastReceiver是接收到廣播后才創建的,并且生命周期很短,因此子線程可能在沒有執行完就已經被殺死了。