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初始化的時候,掃描系統目錄下的文件
2,遍歷循環files文件
3,最終會調用兩個方法:PackageParser.parsePackage()方法;scanPakageLI()方法
4,進入PackageParse類;看到類里面的靜態變量,估計都會知道這貨是干什么用的,解析AndroidManifest.xml文件
5,PackageParse類:最終跳到這里,AssetManager new出來的,然后addAssetPath(apkPath),就可以后去apk里面的資源文件了(插件化方案);
6,調用方法順序分別為:parseBaseApk->parseBaseApkCommon->parseBaseApplication;在這個方法里面有一坨代碼如下:解析xml,然后將解析出來的四大組件放到集合里
7,再回到PackageManagerService;
PackageParser.Package pkg = pp.parsePackage(scanFile, parseFlags);pkg對象包含了當前包里面所有的數據;然后再調用scanPackageLI()->scanPackageDirtyLI();最后將pkg里面的四大組件又add到下面的IntentResolver的子類ActivityIntentResolver、ServiceIntentResolver、ProviderIntentResolver,ArrayMap對象里面
動態注冊:
1,調用ContextImpl類中的registerReceiver方法:(時序圖比較靠譜,看起來比較清晰,但是本人比較懶)
調用Context實現類ContextImpl的注冊方法
2,getReceiverDispatcher方法中的map是以BroadcastReceiver對象r為key,以ReceiverDispatcher對象rd為value保存在一個ArrayMap中,而這個ArrayMap又以Context為key,自己為value保存在LoadedApk類中的成員變量mReceivers中。這樣,只要給定Context和BroadcastReceiver就可以查看LoadedApk中是否已經存在相應的廣播接收分發器ReceiverDispatcher了
3,接下來調用AMS的registerReceiver方法
動態注冊的廣播都添加到mReceiverResolver中了
總結:靜態廣播和動態廣播注冊保存的位置不一樣?