学习插件化之旅(三)广播的实现
最近在学习插件化,整理下知识点。
一、插件app的广播,同样是两种,第一种就是动态注册广播,这种比较简单,第二种就是静态注册的广播,这种比较麻烦,下面分别谈谈两种广播的实现形式。
1、动态注册广播,这种方法其实跟其他两大组件activity和service一样。通过代理类来实现。
a、首先在公共library中,创建一个规则BroadcastReceiver接口,用于注册上下文对象以及创建一个onReceive方法,如下:
图一RuleBroadcastReceiverb、然后在插件app中,创建一个BroadcastReceiver类,集成BroadcastReceiver并且实现上面的规则接口RuleBroadcastReceiver,如下:
图二MyReceiverc、在插件的app中动态注册这个MyReceiver广播,如下
图三插件Mainactivityc、插件app中的BaseActivity中需要重写registerReceiver方法和sendBroadcast,原因是插件app最终集成到宿舍app中是未安装在手机上的,自是以一个apk文件的显示提供给宿主app使用,这里需要重写这两个方法的原因就是因为插件app为安装,导致无法获取上下文对象,就直接在插件app内部无法调用系统自带的这两个方法,这里BaseActivity实现了规则RuleActivity,从而获取了上下文对象,这里重写这两个方法,实际上是为了让宿主app的代理acitvity来调用者两个方法,从而完成广播的注册和发送。
图四插件BaseActivity到此,插件app这关于动态注册广播的地方已经完成了。剩下的就是宿主app的操作了。
d、宿主app中创建一个代理广播ProxyBroadcastReceiver,如下:
图五ProxyBroadcastReceivere、在宿主app的代理activity中重写registerReceiver方法和sendBroadcast方法,并注册代理广播器ProxyBroadcastReceiver,并发送广播,如下:
图六ProxyActivity2、静态注册广播,其实在插件app中所谓的静态注册的广播,最终还是在宿主app中用动态注册的形式去实现的,所用的方式就是扫描插件apk文件中的AndroidMainfest.xml文件,然后找到静态主的广播器,以及使用的action,然后通过动态方式去注册。
a、在插件app中创建一个静态广播,如下:
图七StaticBroadcastReciverb、在插件app的AndroidMainfest.xml文件中注册这个静态广播器,如下:
图八AndroidMainfest.xmlc、在宿主app中扫描插件apk的时候,从插件apk的AndroidMainfest.xml文件中找到静态注册的广播器和挂广播action,并通过动态方式注册,如下:
图九PluginManager注:之前上面说道的是静态注册广播难点就在这里,这里有个知识点就是,我们的手机每次重启之所以慢是因为每次重启,系统都会将手机上已安装的应用重新再安装一遍,二静态广播的注册就是在应用安装的时候完成注册的,而手机安装的时候就会去扫描我们的apk文件,从AndroidMainfest.xml中找到静态广播,完成注册。所以上面的PluginManager类中,就是通过反射的方式,调用系统的方法去完成apk文件中的AndroidMainfest.xml文件扫描获取广播器和action,然后通过动态方式完成注册。
这里留下了一个小问题,就是插件app中的静态注册广播,在宿主app中动态注册来实现,这里的动态注册的广播如何在生命周期中unregisterReceiver。如果哪位大神能解释下,在下感激不尽!!!
d、在宿主app的activity文件中,通过Action向插件app中的静态广播器发送广播,然后插件app的静态广播器在收到宿主发送的广播后回复宿主app一条广播,如下:
图十MainActivity小结:整个插件化的麻烦之处就在PluginManager中,解析插件apk文件,然后反射获取到插件app中的Activity、Service、BroadcastReceiver等文件和各文件中的方法。