日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 四大组件之Content Provider】一文吃透 BroadcastReceiver 广播接收器

發布時間:2023/12/20 Android 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 四大组件之Content Provider】一文吃透 BroadcastReceiver 广播接收器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者:半身風雪
上一節:一文吃透Content Provider 內容提供者
簡介:在Android組件中最基本也是最為常見的四大組件:

  • Activity
  • Service服務
  • Content Provider內容提供者
  • BroadcastReceiver廣播接收器

BroadcastReceiver 廣播接收器

  • 一、什么是BroadcastReceiver
    • 1.1、作用
    • 1.2、實現原理
  • 二、創建廣播接收器
  • 三、注冊廣播接收器
    • 3.1、靜態注冊
      • 3.1.1 注冊
      • 3.1.2、發送通知
    • 3.2、動態注冊
  • 四、系統廣播
  • 總結


一、什么是BroadcastReceiver

BroadcastReceiver 是安卓系統中四大組件之一,在Android開發中,BroadcastReceiver的應用場景非常多,Android 廣播分為兩個角色:廣播發送者、廣播接收者。

1.1、作用

廣播接收器用于響應來自其他應用程序或者系統的廣播消息。

  • 不同組件之間通信(包括應用內 / 不同應用之間)
  • 與 Android 系統在特定情況下的通信(如當電話呼入時、網絡可用時)
  • 多線程通信

1.2、實現原理

Android中的廣播使用了設計模式中的觀察者模式:基于消息的發布/訂閱事件模型。

模型中有3個角色:

  • 消息訂閱者(廣播接收者)

  • 消息發布者(廣播發布者)

  • 消息中心(AMS,即Activity Manager Service)

廣播接收者通過 Binder機制在AMS注冊
廣播發送者通過 Binder 機制向AMS發送廣播
AMS根據廣播發送者要求,在已注冊列表中,尋找合適的廣播接收者(尋找依據:IntentFilter / Permission)
AMS將廣播發送到合適的廣播接收者相應的消息循環隊列中;
廣播接收者通過消息循環拿到此廣播,并回調 onReceive()

二、創建廣播接收器

廣播接收器需要實現為BroadcastReceiver類的子類,并重寫onReceive()方法來接收以Intent對象為參數的消息。

public class MyReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {System.out.println("我是創建好的通知");} }

三、注冊廣播接收器

廣播接收器的注冊分為兩種:

  • 靜態注冊
  • 動態注冊

3.1、靜態注冊

應用程序通過在AndroidManifest.xml中注冊廣播接收器來監聽制定的廣播意圖。

3.1.1 注冊

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/><receiver android:name=".MyReceiver"android:exported="true"><intent-filter><action android:name="com.tiger_test"tools:ignore="BatteryLife" /></intent-filter> </receiver>

3.1.2、發送通知

在Activity 中新增一個發送通知的點擊事件

public void onClickStatic(View view) {System.out.println("MainActivity2.onClickStatic"); // com.tiger_test 必須和清單文件中注冊的保持一致Intent intent = new Intent();intent.setAction("com.tiger_test");intent.setPackage("com.traveleasy.activitydemo");sendBroadcast(intent);}

當點擊通知發送按鈕時,系統會自動實例化MyReceiver類,并注冊到系統中。

靜態注冊是常駐廣播,不受任何組件生命周期的影響

注意:由于自8.0以后隱式廣播不能進行靜態注冊了,所以這里通過setPackage()指定應用程序響應廣播。

3.2、動態注冊

通過registerReceiver()注冊廣播監聽

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);// 在onCreate 中注冊廣播MyReceiver myReceiver = new MyReceiver();IntentFilter filter = new IntentFilter();filter.addAction("com.tiger_test");registerReceiver(myReceiver, filter);}

觸發通知

public void onClickStatic(View view) {// com.tiger_test 必須和注冊的保持一致Intent intent = new Intent();intent.setAction("com.tiger_test");sendBroadcast(intent); }

在頁面關閉時記得通過unregisterReceiver()注銷廣播監聽,否則會因廣播持有Activity引用導致內存泄露。

@Override protected void onDestroy() {super.onDestroy();unregisterReceiver(myReceiver); }

運行結果

需要注意,在onReceive()不能執行耗時操作,onReceive()默認是在主線程中,進行耗時會阻塞主線程,如果非要執行耗時操作最好開啟一個服務在服務中進行耗時操作,不建議開啟線程來處理耗時操作,因為BroadCastReceiver的生命周期很短,可能在子線程結束前BroadCastReceiver已經退出,如果當BroadCastReceiver所在的進程結束,雖然該進程中可能有用戶啟動的新線程,但是由于該進程內沒有活動的組件,系統會在內存緊張的時候,優先結束掉該進程,這就會導致BroadCastReceiver啟動的子線程不能執行完。

四、系統廣播

上面我們一起學習了自定義廣播,下面我們一起來看一下Android 系統主要的系統廣播類型。

事件常量描述
android.intent.action.BATTERY_CHANGED持久的廣播,包含電池的充電狀態,級別和其他信息。
android.intent.action.BATTERY_LOW標識設備的低電量條件。
android.intent.action.BATTERY_OKAY標識電池在電量低之后,現在已經好了。
android.intent.action.BOOT_COMPLETED在系統完成啟動后廣播一次。
android.intent.action.BUG_REPORT顯示報告bug的活動。
android.intent.action.CALL執行呼叫數據指定的某人。
android.intent.action.CALL_BUTTON用戶點擊"呼叫"按鈕打開撥號器或者其他撥號的合適界面。
android.intent.action.DATE_CHANGED日期發生改變。
android.intent.action.REBOOT設備重啟。

總結

在BroadcastReceiver 中,廣播的類型主要分為兩大類

  • 標注廣播
  • 有序廣播

標準廣播

標準廣播是一種完全異步執行的廣播,在廣播發出之后,所有的BroadcastReceiver幾乎在同一時刻收到這個廣播消息,它們之間沒有先后順序,這種廣播的效率較高,并且不能被攔截。

有序廣播

有序廣播是一種完全同步的廣播,在廣播發出后只能有一個BroadcastReceiver能接收到這個廣播消息,當這個BroadcastReceiver中的邏輯執行完畢后,廣播才能繼續向下傳遞。所以這個廣播是有順序的,所以這種廣播也是可以被攔截的,如果被攔截了后面的BroadCastReceiver則不能收到廣播消息了。

總結

以上是生活随笔為你收集整理的【Android 四大组件之Content Provider】一文吃透 BroadcastReceiver 广播接收器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。