1. 程式人生 > >android總結系列:Broadcast

android總結系列:Broadcast

概念

Android廣播分為兩個方面:廣播發送者和廣播接收者,通常情況下,BroadcastReceiver指的就是廣播接收者(廣播接收器)。sendBroadcast指的是廣播發送者。
從實現原理看上,Android中的廣播使用了觀察者模式,基於訊息的釋出/訂閱事件模型。因此,從實現的角度來看,Android中的廣播將廣播的傳送者和接受者極大程度上解耦,使得系統能夠方便整合,更易擴充套件。

使用場景

1.同一app內部的同一組件內的訊息通訊(單個或多個執行緒之間);

2.同一app內部的不同元件之間的訊息通訊(單個程序);

3.同一app具有多個程序的不同元件之間的訊息通訊;

4.不同app之間的元件之間訊息通訊;

5.Android系統在特定情況下與App之間的訊息通訊。

在上文說列舉的廣播機制具體可以使用的場景中,現分析實際應用中的適用性

第一種情形:同一app內部的同一組件內的訊息通訊(單個或多個執行緒之間),實際應用中肯定是不會用到廣播機制的(雖然可以用),無論是使用擴充套件變數作用域、基於介面的回撥還是Handler-post/Handler-Message等方式,都可以直接處理此類問題,若適用廣播機制,顯然有些“殺雞牛刀”的感覺,會顯太“重”;

第二種情形:同一app內部的不同元件之間的訊息通訊(單個程序),對於此類需求,在有些教複雜的情況下單純的依靠基於介面的回撥等方式不好處理,此時可以直接使用EventBus等,相對而言,EventBus由於是針對統一程序,用於處理此類需求非常適合,且輕鬆解耦。可以參見檔案《Android各元件/控制元件間通訊利器之EventBus》。

第三、四、五情形:由於涉及不同程序間的訊息通訊,此時根據實際業務使用廣播機制會顯得非常適宜。下面主要針對Android廣播中的具體知識點進行總結

具體實現流程概述

1.廣播接收者BroadcastReceiver通過Binder機制向AMS(Activity Manager Service)進行註冊;

2.廣播發送者通過binder機制向AMS傳送廣播;

3.AMS查詢符合相應條件(IntentFilter/Permission等)的BroadcastReceiver,將廣播發送到BroadcastReceiver(一般情況下是Activity)相應的訊息迴圈佇列中;

4.訊息迴圈執行拿到此廣播,回撥BroadcastReceiver中的onReceive()方法。

註冊方式

註冊方式分為靜態註冊和動態註冊
注:Android中所有與觀察者模式有關的設計中,一旦涉及到register,必定在相應的時機需要unregister。因此,上例在onDestroy()回到中需要unregisterReceiver(mBroadcastReceiver)。
當此Activity例項化時,會動態將MyBroadcastReceiver註冊到系統中。當此Activity銷燬時,動態註冊的MyBroadcastReceiver將不再接收到相應的廣播。

廣播發送及廣播型別

廣播發送示例程式碼:

Intent intent = new Intent();
intent.setAction(BROADCAST_ACTION);
intent.putExtra("name", "qqyumidi");
sendBroadcast(intent);

廣播型別
1.Normal Broadcast:普通廣播

2.System Broadcast: 系統廣播

3.Ordered broadcast:有序廣播

4.Sticky Broadcast:粘性廣播(在 android 5.0/api 21中deprecated,不再推薦使用,相應的還有粘性有序廣播,同樣已經deprecated)

5.Local Broadcast:App應用內廣播

Local Broadcast示例程式碼

//registerReceiver(mBroadcastReceiver, intentFilter);
//註冊應用內廣播接收器
localBroadcastManager = LocalBroadcastManager.getInstance(this);
localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter);

//unregisterReceiver(mBroadcastReceiver);
//取消註冊應用內廣播接收器
localBroadcastManager.unregisterReceiver(mBroadcastReceiver);

Intent intent = new Intent();
intent.setAction(BROADCAST_ACTION);
intent.putExtra("name", "qqyumidi");
//sendBroadcast(intent);
//傳送應用內廣播
localBroadcastManager.sendBroadcast(intent);

注意事項

1).Android5.0/API level 21開始粘滯廣播和有序粘滯廣播過期,以後不再建議使用;

2).”靜態註冊的廣播接收器即使app已經退出,主要有相應的廣播發出,依然可以接收到,但此種描述自Android 3.1開始有可能不再成立“

Broadcast詳細總結戳這裡