android 廣播源碼簡要分析-注冊

android broadcast

多謝大神
http://blog.csdn.net/zhangyongfeiyong/article/details/51980348
http://blog.csdn.net/yangwen123/article/details/9109495
http://gityuan.com/2016/06/04/broadcast-receiver/

1,廣播注冊

靜態注冊:

在系統服務啟動時會添加PackageManagerService,在該類的構造方法中就會對各個應用安裝目錄的apk文件進行掃描解析

詳細步驟

1,PackageManagerService初始化的時候,掃描系統目錄下的文件


image.png

2,遍歷循環files文件


image.png

3,最終會調用兩個方法:PackageParser.parsePackage()方法;scanPakageLI()方法
image.png

4,進入PackageParse類;看到類里面的靜態變量,估計都會知道這貨是干什么用的,解析AndroidManifest.xml文件

image.png

5,PackageParse類:最終跳到這里,AssetManager new出來的,然后addAssetPath(apkPath),就可以后去apk里面的資源文件了(插件化方案);

image.png

6,調用方法順序分別為:parseBaseApk->parseBaseApkCommon->parseBaseApplication;在這個方法里面有一坨代碼如下:解析xml,然后將解析出來的四大組件放到集合里

image.png

7,再回到PackageManagerService;
PackageParser.Package pkg = pp.parsePackage(scanFile, parseFlags);pkg對象包含了當前包里面所有的數據;然后再調用scanPackageLI()->scanPackageDirtyLI();最后將pkg里面的四大組件又add到下面的IntentResolver的子類ActivityIntentResolver、ServiceIntentResolver、ProviderIntentResolver,ArrayMap對象里面


image.png

動態注冊:

1,調用ContextImpl類中的registerReceiver方法:(時序圖比較靠譜,看起來比較清晰,但是本人比較懶)
調用Context實現類ContextImpl的注冊方法


image.png

2,getReceiverDispatcher方法中的map是以BroadcastReceiver對象r為key,以ReceiverDispatcher對象rd為value保存在一個ArrayMap中,而這個ArrayMap又以Context為key,自己為value保存在LoadedApk類中的成員變量mReceivers中。這樣,只要給定Context和BroadcastReceiver就可以查看LoadedApk中是否已經存在相應的廣播接收分發器ReceiverDispatcher了

QQ截圖20171017185143.png
image.png

3,接下來調用AMS的registerReceiver方法
動態注冊的廣播都添加到mReceiverResolver中了

總結:靜態廣播和動態廣播注冊保存的位置不一樣?

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

推薦閱讀更多精彩內容