Android - base - Broadcast

四大組件之廣播

大綱

  • 廣播機制簡介
  • 廣播接收器
  • 廣播發信器
  • 接收系統廣播
  • 發送自定義廣播
  • 本地廣播

#廣播機制簡介

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
的程序。
通常廣播發送方都是通過隱式意圖,這樣才能發送給多人。

##廣播分類
  1. 標準廣播 Normal broadcasts :異步執行,廣播發出后所有 接收器 幾乎同時接收到廣播信息,并同時執行 接收器的邏輯。標準廣播無法截斷。
  2. 有序廣播 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):獲取實例

注意

  1. onReceive方法必須在10秒內完成,如果沒有完成,則拋'Application No Response'。

  2. 當廣播接收者onReceive方法需要執行很長時間時,最好將此耗時工作通過Intent發送給Service,由Service完成。并且不能使用子線程解決,因為BroadcastReceiver是接收到廣播后才創建的,并且生命周期很短,因此子線程可能在沒有執行完就已經被殺死了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容