Android BroadcastReceiver(廣播)

一 、BroadcastReceiver(廣播)定義

  • 首先看下android api對BroadcastReceiver的定義:

    Android apps can send or receive broadcast messages from the Android
    system and other Android apps, similar to the publish-subscribe design
    pattern. These broadcasts are sent when an event of interest occurs.
    For example, the Android system sends broadcasts when various system
    events occur, such as when the system boots up or the device starts
    charging. Apps can also send custom broadcasts, for example, to notify
    other apps of something that they might be interested in (for example,
    some new data has been downloaded).

  • 從第一句話中可以看出,BroadcastReceiver(廣播)是一種可以運用在應用程序之間傳遞信息。

二、 BroadcastReceiver使用場景

  • (1)應用程序內部不同組件之間的通信,包括APP多進程之間的通信
  • (2)不同應用程序之間的消息通信

三、 BroadcastReceiver類型

  • 一般廣播(Normal Broadcast):通過Context.sendBroadcast()發送。
  • 有序廣播(Ordered Broadcast):通過Context.sendOrderedBroadcast()發送。

    有序廣播是用sendOrderedBroadcast來發送。高優先級的接收者會先接收到廣播,然後它可以決定是否繼續轉發,讓低優先級的接收者接收到,或者終止廣播。高優先級的接收者可以通過setResult把一些信息傳給下一個接收者,下一個接收者則通過getResult獲取上一個接收者傳過來的信息。這個優先級也是用android:priority來設置,範圍是-1000到1000。

  • 粘性廣播(Sticky Broadcast):通過Context.sendStickyBroadcast()發送;

    即使沒有接收者,發送的廣播Intent也會一直駐留在系統中,一旦有receiver註冊,就會立即收到之前發送的廣播。發送這個廣播的應用需要權限

    <uses-permission android:name="android.permission.BROADCAST_STICKY" />

    如果sendStickyBroadcast發了多個廣播,但暫時沒有接收者,系統會保留最後一條廣播。當有receiver接收到廣播並處理後,系統中駐留的廣播Intent仍存在,只有在接收者調用removeStickyBroadcast後系統纔會移除該Intent。

  • 本地廣播(Local Broadcast):只在APP內部之間傳遞的廣播。通過support V4包中提供的LocalBroadcastManager來發送廣播,其內部是通過Handler的來實現。

四、 BroadcastReceiver註冊方式


  • (1)靜態註冊:在AndroidManifest.xml文件中註冊,該註冊方式,註冊完成後,會一直運行。
  • (2)動態註冊:在Activity中通過調用registerReceiver()/unregisterReceiver()進行註冊解註冊。跟隨activity的生命週期。

注意:動態註冊的廣播優先級高於靜態註冊的優先級,在sendBroadcast()之後,AMS(Activity Manager
Service)會接受處理查找對應的廣播接收者。在AMS中靜態註冊的接收者存在一張表中;動態註冊的接受者單獨存在一張表。AMS會合並兩張表,並按照優先級進行排序。如果優先級相同,則把動態註冊的廣播放在前面。

五、 BroadcastReceiver注意點

  • 廣播的OnReceiver()方法是運行在UI線程中的,如果執行耗時超過10s的操作,就會ANR異常,需要把耗時操作放到service或者工作線程中去。

參考博文:

參考官方指導api:


GitHub :Android知識點總結

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章