在《Replugin插件化技术解读之插件四大组件调用原理-Activity(一)》中描述了Replugin插件框架中宿主app和插件app是如何如何启动插件Activity的大致流程,显然既然讲述了Activity,作为Android四大组件之一的Service当然也要说明下怎么玩的啦。看官继续往下看。^_^
一、开启插件内Service
第1步:在《Replugin插件化技术解读之框架初始化、插件安装与加载(二)》中我们知道插件在加载的时候会自动生成PluginContext来作为插件内上下文使用,而插件中startService其实调用的就是已经被重写的startService方法了。
PluginContext.java
public ComponentName startService(Intent service) {
if (mContextInjector != null) {
mContextInjector.startServiceBefore(service);
}
。。。
try {
return PluginServiceClient.startService(this, service, true);
} catch (PluginClientHelper.ShouldCallSystem e) {
// 若打开插件出错,则直接走系统逻辑
return super.startService(service);
} finally {
if (mContextInjector != null) {
mContextInjector.startServiceAfter(service);
}
}
}
第2步: PluginServiceClient.startService中会首先获取ComponentName对象,得到插件包名和对应Service Class类型对象,然后获得开启的Service所属的进程号,如UI进程或者常驻进程。接着会通过进程号获得对应的IPluginServiceService pss对象,进行pss.startService操作。
public static ComponentName startService(Context context, Intent intent, boolean throwOnFail) {
// 1. 从 Intent 中获取 ComponentName,包含想要开启的ServiceName以及插件包名
ComponentName cn = getServiceComponentFromIntent(context, intent);
// 2. 获取将要使用服务的进程ID,
int process = getProcessByComponentName(cn);
if (process == PROCESS_UNKNOWN) {
// 有可能是不支持的插件,也有可能本意就是想调用Main工程的服务。则直接调用系统方法来做
if (LOG) {
LogDebug.d(PLUGIN_TAG, "PSS.startService(): Call SystemAPI: in=" + intent);
}
if (throwOnFail) {
throw new PluginClientHelper.ShouldCallSystem();
} else {
return context.startService(intent);
}
}
// 既然确认是插件,则将之前获取的插件信息填入
intent.setCompo