在《Replugin插件化技术解读之框架初始化、插件安装与加载(一)》和《Replugin插件化技术解读之框架初始化、插件安装与加载(二)》中讲解了Replugin插件框架的初始化以及外置、内置插件的安装加载,那么到这里整个插件框架的所有准备初始化工作都执行完毕啦,我们从现在起就可以愉快的调用插件中的四大组件来玩耍啦。
一、开启插件Activity流程
第1步:开启插件Activity的入口在Replugin.StartActivity(Context context, Intent intent),其他intent内部一定要传入想要开启的插件名。
public static boolean startActivity(Context context, Intent intent) {
// TODO 先用旧的开启Activity方案,以后再优化
ComponentName cn = intent.getComponent();
if (cn == null) {
// TODO 需要支持Action方案
return false;
}
String plugin = cn.getPackageName();
String cls = cn.getClassName();
return Factory.startActivityWithNoInjectCN(context, intent, plugin, cls, IPluginManager.PROCESS_AUTO);
}
Factory.startActivityWithNoInjectCN内部调用sPluginManager.startActivity方法,那么sPluginManager是哪里传进去的?
PMF.java
Factory.sPluginManager = PMF.getLocal();
Factory2.sPluginManager = PMF.getInternal();
看下PMF.init的方法可以看到sPluginManager是PMF内部维护的sPluginMgr.mLocal,也就是Pmbase内部的PmLocalmpl mLocal对象,继续跟踪发现真正实现startActivity逻辑的是PmBase内部的PmInternalmpl.startActivity下面这个方法。
public boolean startActivity(Context context, Intent intent, String plugin, String activity, int process, boolean download) {
。。。
}
第2步:重点走读下上面startActivity方法,首先会判断要跳转的插件是否已经存在了,如果不存在则回调callback接口去提示用户下载等逻辑操作,
如果插件状态不正确,则回调外部callback去提示用户插件不可用或者去升级,如果插件首次加载并且是大插件则异步加载并弹窗显示正在加载。然后在调用context.startActivity方法前会去通过下面的loadPluginActivity方法将目标插件Activity class替换为“坑位”Activity,这样其实传给AMS的还是宿主的坑位Activity。
PmI