});
}
}
这里可以看到,是通过 HostApplication 获取到 PluginManager,然后调用其 enter 方法,进入插件。这里先看看返回的 PluginManager 是什么。
class HostApplication extends Application {
public void loadPluginManager(File apk) {
if (mPluginManager == null) {
// 创建 PluginManager
mPluginManager = Shadow.getPluginManager(apk);
}
}
public PluginManager getPluginManager() {
return mPluginManager;
}
}
public class Shadow {
public static PluginManager getPluginManager(File apk){
final FixedPathPmUpdater fixedPathPmUpdater = new FixedPathPmUpdater(apk);
File tempPm = fixedPathPmUpdater.getLatest();
if (tempPm != null) {
// 创建 DynamicPluginManager
return new DynamicPluginManager(fixedPathPmUpdater);
}
return null;
}
}
可以看到,HostApplication 里返回的其实是一个 DynamicPluginManager 实例,那么接下来就要看 DynamicPluginManager 的 enter 方法。
class DynamicPluginManager implements PluginManager {
@Override
public void enter(Context context, long fromId, Bundle bundle, EnterCallback callback) {
// 加载 mManagerImpl 实现,这里涉及到了框架的自身动态化,在后面会讲到,这里只要知道,mManagerImpl 最终是 SamplePluginManager 实例即可
updateManagerImpl(context);
// mManagerImpl 是 SamplePluginManager 实例,调用其实现
mManagerImpl.enter(context, fromId, bundle, callback);
mUpdater.update();
}
}
通过上面的代码我们知道了,调用 DynamicPluginManager.enter 会转发到 SamplePluginManager.enter 中去,接着就看看这个实现。
class SamplePluginManager extends FastPluginManager {
public void enter(final Context context, long fromId, Bundle bundle, final EnterCallback callback) {
// …
// 启动 Activity
onStartActivity(context, bundle, callback);
// …
}
private void onStartActivity(final Context context, Bundle bundle, final EnterCallback callback) {
// …
final String className = bundle.getString(Constant.KEY_ACTIVITY_CLASSNAME);
// …
final Bundle extras = bundle.getBundle(Constant.KEY_EXTRAS);
if (callback != null) {
// 创建 loading view
final View view = LayoutInflater.from(mCurrentContext).inflate(R.layout.activity_load_plugin, null);
callback.onShowLoadingView(view);
}
executorService.execute(new Runnable() {
@Override
public void run() {
// …
// 加载插件
InstalledPlugin installedPlugin = installPlugin(pluginZipPath, null, true);
// 创建插件 Intent
Intent pluginIntent = new Intent();
pluginIntent.setClassName(
context.getPackageName(),
className
);
if (extras != null) {
pluginIntent.replaceExtras(extras);
}
// 启动插件 Activity
startPluginActivity(context, installedPlugin, partKey, pluginIntent);
// …
}
});
}
}
在 SamplePluginManager.enter 中,调用 onStartActivity 启动插件 Activity,其中开线程去加载插件,然后调用 startPlugi