2.2 service
和activity相同的是,在ServcesManager的handleCreateServiceOne方法匹配,加载完成插件的service之后,
就会调用PluginManager的onServiceCreated进行service管理。
PluginManager.getInstance().onServiceCreated(stubInfo, info);
在系统调用AMS的stopService / stopServiceToken 方法时,也就是停止服务。IactivityManagerHookHandle的
内部类stopService的beforeInvoke方法如下,
int re = ServcesManager.getDefault().stopService(mHostContext, intent);
ServcesManager的stopService方法逻辑如下,
1,找到匹配目标的插件的ServiceInfo
ServiceInfo targetInfo = PluginManager.getInstance().resolveServiceInfo(intent, 0);
2,调用handleOnDestroyOne方法。
handleOnUnbindOne(intent);
handleOnDestroyOne(targetInfo);
IactivityManagerHookHandle的内部类stopServiceToken的beforeInvoke方法如下,
boolean re = ServcesManager.getDefault().stopServiceToken(componentName, token, startId);
ServcesManager的stopServiceToken方法和stopService的逻辑类似,最后也会调用handleOnDestroyOne方法,该方法如下,
private void handleOnDestroyOne(ServiceInfo targetInfo) {
Service service = mNameService.get(targetInfo.name);
if (service != null) {
service.onDestroy();
mNameService.remove(targetInfo.name);
Object token = findTokenByService(service);
mTokenServices.remove(token);
mServiceTaskIds.remove(token);
service = null;
QueuedWorkCompat.waitToFinish();
PluginManager.getInstance().onServiceDestory(null, targetInfo);
}
QueuedWorkCompat.waitToFinish();
}
首先删除相关数组,然后调用PluginManager的onServiceDestory方法。
和activity一样,先论述onServiceCreated方法,然后论述onServiceDestory方法
2.2.1 创建
PluginManager的onServiceCreated方法调用流程图如下,
详细的调用说明在此就不论述了。
2.2.2 Destory
PluginManager的onServiceDestory方法调用流程图如下,
2.3 ContentProvider
AbstractContentProviderStub的query/insert/delete/update等方法都会调用getContentProviderClient获取插件的
真是ContentProvider对象,并且在该方法匹配/加载完成之后,会调用PluginManager的onProviderCreated方法对插件
的ContentProvider进行管理,
PluginManager.getInstance().onProviderCreated(stubInfo, targetInfo);
PluginManager的onProviderCreated方法调用流程图如下,
这里面和activity/ service不同的是, ContentProvider管理没有回收。
虽然RunningProcesList的内部类ProcessItem有实现removeProviderInfo方法,但是并没有任何地方调用该方法。
并且,进行进程垃圾回收时,也仅回收activity/ service 所在的进程。