android广播注册源码,android 广播源码简要分析-注册
android broadcast
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中了
總結:靜態廣播和動態廣播注冊保存的位置不一樣?
總結
以上是生活随笔為你收集整理的android广播注册源码,android 广播源码简要分析-注册的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android fragment 弹出对
- 下一篇: flume-ng 入 oracle,fl