Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 插件占坑,四大組件動態注冊前奏(三) 系統BroadCast的注冊發送流程

插件占坑,四大組件動態注冊前奏(三) 系統BroadCast的注冊發送流程

編輯:關於Android編程

前言:為什麼要了解系統Activity,Service,BroadCastReceiver,ContentProvider的啟動流程,這是一個對於即將理解插件中的四大組件動態注冊,占坑的前提,如果不了解的話,那麼很難了解插件hook哪此東西,又是如何騙過AMS來啟動Activity,Service,BroadCastReceiver,ContentProvider?

本節主要記錄系統BroadCastReceiver的注冊,發送流程:

在了解注冊,發送之前,先想一個問題:為什麼有廣播?

  • 1、廣播是一種組件之間傳遞的方式,這些組件可以運行在同一進程中,也可以運行在不同的進程中。
  • 2、廣播的機制是建立在Binder進程間通信基礎上的。在Binder進程間通信,Client組件在和Service組件進行通信之前,必須要先獲取它的一個代理對象,即Client組件事先要知道Service組件的存在。然而,在廣播機制中,廣播發送者事先不需要知道廣播接收者是存在的,這樣就可以降低廣播接收者和發送者之間的耦合度,得到模塊分離。
  • 3、廣播機制是一種基於消息發布和訂閱的事件驅動模型,廣播發送者負責發布消息,而廣播接收者需要先訂閱消息,然後才能收到消息。
  • 4、廣播機制存在一個注冊中心,它是由ActivityManagerService來擔當的,廣播接收者訂閱消息的表現形式就是將自己注冊到ActivieyManagerService中,並且指定要接收的廣播的類型,當廣播發送者向廣播接收者發送一個廣播時,這個廣播首先發送到ActivityManagerService,然後ActivityManagerService可根據這個類型找到相應的廣播接收者,最後將這個廣播發送給它們處理。
  • 5、廣播接收者的注冊分為靜態注冊和動態注冊,廣播的發送方式分為有序和無序兩種
  • 6、廣播的生命周期,從對象調用它開始,到onReceiver方法執行完成之後結束。另外,每次廣播被接收後會重新創建BroadcastReceiver對象,並在onReceiver方法中執行完就銷毀,如果BroadcastReceiver的onReceiver方法中不能在10秒內執行完成,Android會出現ANR異常。所以不要在BroadcastReceiver的onReceiver方法中執行耗時的操作。
  • 7、如果需要在BroadcastReceiver中執行耗時的操作,可以通過Intent啟動Service來完成。但不能綁定Service。特別是,您可能無法從一個BroadcastReceiver中顯示一個對話框,或綁定到服務。對於前者,則應該使用NotificationManager的API。對於後者,你可以使用Context.startService()來啟動一個Service。

BroadCastReceiver注冊流程

先看一張時序圖:
這裡寫圖片描述

首先得有一個廣播類,以下叫MyBroadCastReceiver:

這裡寫圖片描述

有一個TestBroadCastActivity的類:

這裡寫圖片描述

通過動態注冊的方式注冊了一個MyBroadCastReceiver廣播類,以上就是一個廣播的注冊過程。

BroadCastReceiver發送流程

先看下面兩張時序圖(ps:太長,只能分開截圖):發送過程遠比注冊過程復雜的多

這裡寫圖片描述

這裡寫圖片描述

廣播的發送過程:

1、廣播發送者,即一個Activity組件或者一個service組件,將一個特定類型的廣播發送給ActivityManagerService; 2 、ActivityManagerService接收到一個廣播之後,首先找到與這個廣播對應的廣播接收者,然後將他們添加一個廣播調度隊列中,最後向
ActivityManagerService發送一個類型為BROADCAST_INTENT_MSG的值,這時廣播對發送者來說,一個廣播發送過程就完成了; 3、當發送到ActivityManagerService所運行的線程的消息隊列中BROADCAST_INTENT_MSG消息被處理時,ActivityManagerService就會從廣播調度隊列中找到需要的廣播的接收者,並且將對應的廣播發送給它們所運行的應用程序進程。 4、廣播接收者所運行在的應用程序進程接收到ActivityManagerService發送過來的廣播之後,並不是直接將接受到的廣播分發給廣播接收者來處理,而是將接收到的廣播封裝成一個消息,並且發送到主線程的消息隊列中,當這個消息被處理時,應用程序進程才會將它所描述的廣播發送給相應的廣播接收者處理。 5、ActivityManagerService向一個應用程序發送一個廣播時,采用的是異步進程間通信,Binder驅動結構體中binder_node時提到,發送給一一個Binder實體對象的所有異步事務都是保存在一個異步事務隊列中的,由於保存在一個異步事務隊列中的異步事務在同一時刻只有一個會得到處理,即只有位於隊列頭部的異步事務才會得到處理,因為,ActivityManagerService就可以保證它發送給同一個應用程序的所有都可以按照發送順序來串行地接收和處理。

以上就是廣播的注冊發送過程,ContentProvider不再分析,下篇將正式進入插件占坑,四大組件動態化注冊分析。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved