Broadcast
廣播介紹&使用
廣播是android中各個模塊通信的一種方法显拜。有發(fā)送方,接收方掌唾。
-
發(fā)廣播的方式如下代碼:
Intent intent = new Intent(); intent.setAction("com.xxx.just_for_test"); sendBroadcast(intent);
3.廣播的接受有兩種方式(1)靜態(tài)注冊(2)動態(tài)注冊
? ? ? ?(1)動態(tài)注冊
IntentFilter filter = new IntentFilter();
filter.addAction("com.xxx.just_for_test");
this.registerReceiver(mReceiver, filter);
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TAG", "onReceive: ");
}
};
? ? ? ?onReceive中就是對接受到這個廣播的處理镇匀,注意動態(tài)注冊的在最后要進(jìn)行unRegisterReceiver()跟activity的生命周期保證一致。
? ? ? ?(2)靜態(tài)注冊
? ? ? ? 首先要在manifest中注冊:
<receiver android:name=".TestReceiver"
android:enabled="true" //表示可以接受到信息饺鹃。
android:exported="true">//表示可以接收到外部APK的信息
<intent-filter>
<action android:name="com.xxx.just_for_test"/>
</intent-filter>
</receiver>
? ? ? ? 注意action 要對應(yīng),然后新起一個類
public class TestReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TAG","onReceive");
}
}
? ? ? ?這樣兩個廣播的方式就都寫出來了间雀,簡單的用法就是這樣悔详。唯一需要注意的就是onReceive方法中是在主線程執(zhí)行的,10S干不完事情就會報ANR惹挟。
? ? ? ?例外用內(nèi)部類實(shí)現(xiàn)也是可以的茄螃,但是要使用靜態(tài)內(nèi)部類,首席實(shí)例化xml的時候會去實(shí)例化你這個內(nèi)部類匪煌,非靜態(tài)內(nèi)部類的實(shí)現(xiàn)要通過父類责蝠,因?yàn)楦割悰]有實(shí)例化 所以會一直報錯has no zero argument constructor党巾。設(shè)置成靜態(tài)內(nèi)部類就沒有這個問題萎庭。
? ? ? ?這里可以mark一下,java基礎(chǔ)齿拂。
廣播分類
普通廣播
? ? ? ?普通廣播就是我們調(diào)用的sendBroadcast(),只要注冊了action的Receiver(不同的APP也可以)都可以接到驳规,但是接到的這個的過程是異步的,誰先誰后不知道署海。-
有序廣播
? ? ? ?就是考慮一個優(yōu)先級吗购。取值范圍-1000~1000越大優(yōu)先級越高 靜態(tài):<intent-filter android:priority="100"> <action android:name="com.xxx.just_for_test"/> </intent-filter>
動態(tài):
IntentFilter filter = new IntentFilter();
filter.addAction("com.xxx.just_for_test");
filter.setPriority(100);
會按照設(shè)置的Priority來先后調(diào)用注冊的receiver医男。高等級的receiver可以調(diào)用abortBroadcast();來阻止下面的接收到這個廣播。
- 本地廣播
這個其實(shí)就是為了不讓其他APP跟我們這邊APP進(jìn)行通信處理捻勉。使用方法如下
public static void sendLocalBroadcast(Intent intent) {
LocalBroadcastManager.getInstance(getInstance()).sendBroadcast(intent);
}
public static void registerLocalReceiver(BroadcastReceiver receiver, IntentFilter filter) {
LocalBroadcastManager.getInstance(getInstance()).registerReceiver(receiver, filter);
}
public static void unregisterLocalReceiver(BroadcastReceiver receiver) {
LocalBroadcastManager.getInstance(getInstance()).unregisterReceiver(receiver);
}
- Sticky廣播
? ? ? ? 現(xiàn)已經(jīng)廢棄镀梭。
使用廣播遇到的問題
? ? ? ? 其實(shí)廣播的分類應(yīng)該還有一個系統(tǒng)廣播,這個廣播由系統(tǒng)發(fā)出踱启,比如開機(jī)廣播报账。之所以沒在上面進(jìn)行介紹,是因?yàn)檫@個廣播在android 8.0新特性中有了一些新的規(guī)定埠偿。部分通過靜態(tài)注冊的系統(tǒng)廣播不再可以進(jìn)行接受透罢。因?yàn)殪o態(tài)廣播的注冊一直是在后臺消耗一定資源的。通過動態(tài)注冊可以解決這個問題冠蒋。 當(dāng)然還有發(fā)送的intent設(shè)置FLAG_RECEIVER_EXCLUDE_BACKGROUND羽圃;時候也不能接收到廣播,8.0之后intent設(shè)置值的時候需要帶上
貼圖片是為了更好的看懂兩個參數(shù)是什么抖剿。
? ? ? ?查看一下RECEIVER_EXCLUDE_BACKGROUND朽寞,發(fā)現(xiàn)對應(yīng)的Flag:FLAG_RECEIVER_INCLUDE_BACKGROUND = 0x01000000;即我們可以通過intent.addFlags(0x01000000);也可以進(jìn)行突破限制 實(shí)現(xiàn)廣播的正常使用。