西安建设主管部门官方网站,wordpress返回件,今天上海最新新闻事件,应用公园app制作教程android broadcast1#xff0c;广播注册静态注册#xff1a;在系统服务启动时会添加PackageManagerService#xff0c;在该类的构造方法中就会对各个应用安装目录的apk文件进行扫描解析详细步骤1#xff0c;PackageManagerService初始化的时候#xff0c;扫描系统目录下的…android broadcast1广播注册静态注册在系统服务启动时会添加PackageManagerService在该类的构造方法中就会对各个应用安装目录的apk文件进行扫描解析详细步骤1PackageManagerService初始化的时候扫描系统目录下的文件image.png2遍历循环files文件image.png3最终会调用两个方法PackageParser.parsePackage()方法scanPakageLI()方法image.png4进入PackageParse类看到类里面的静态变量估计都会知道这货是干什么用的解析AndroidManifest.xml文件image.png5PackageParse类最终跳到这里AssetManager new出来的然后addAssetPath(apkPath),就可以后去apk里面的资源文件了(插件化方案)image.png6调用方法顺序分别为parseBaseApk-parseBaseApkCommon-parseBaseApplication;在这个方法里面有一坨代码如下解析xml然后将解析出来的四大组件放到集合里image.png7再回到PackageManagerService;PackageParser.Package pkg pp.parsePackage(scanFile, parseFlags);pkg对象包含了当前包里面所有的数据然后再调用scanPackageLI()-scanPackageDirtyLI();最后将pkg里面的四大组件又add到下面的IntentResolver的子类ActivityIntentResolver、ServiceIntentResolver、ProviderIntentResolverArrayMap对象里面image.png动态注册1调用ContextImpl类中的registerReceiver方法(时序图比较靠谱看起来比较清晰但是本人比较懒)调用Context实现类ContextImpl的注册方法image.png2getReceiverDispatcher方法中的map是以BroadcastReceiver对象r为key以ReceiverDispatcher对象rd为value保存在一个ArrayMap中而这个ArrayMap又以Context为key自己为value保存在LoadedApk类中的成员变量mReceivers中。这样只要给定Context和BroadcastReceiver就可以查看LoadedApk中是否已经存在相应的广播接收分发器ReceiverDispatcher了QQ截图20171017185143.pngimage.png3接下来调用AMS的registerReceiver方法动态注册的广播都添加到mReceiverResolver中了总结静态广播和动态广播注册保存的位置不一样?