Android LocalServices解耦妙用: system_server进程中各个服务之间的连通器LocalServices
LocalServices是system_server进程中各个服务提供的本地服务。
本质上分析:LocalServices就是一个公开缓存池,
system_server进程中每个服务都可以往LocalServices放对象。
例如:ActivityTaskManagerService服务,通过如下方法:
LocalServices.addService(ActivityTaskManagerInternal.class, mInternal);
把mInternal对象放进LocalServices这个公开缓存池,其他服务就可以通过如下方法:
LocalServices.getService(ActivityTaskManagerInternal.class);
得到该对象,进而通过该对象访问和使用ActivityTaskManagerService服务。
LocalServices是公开缓存池目的是:解耦。
即:让system_server进程中各个服务弱耦合。
因此发现LocalServices有如此的妙用:
可以通过LocalServices,放扩展该服务接口的对象。
注意:不要随意放LocalServices放太多的对象,因为对象太多检索也会耗时。
建议在需要增加扩展接口的服务中,只需要放一个扩展服务接口的对象即可。
例子Demo:
例如:ActivityTaskManagerService服务中没有提供获取焦点App的接口,
于是,就可以通过LocalServices放扩展该服务接口的对象MyXXXActivityTaskManagerInternal。
这样system_server进程中的其他地方就可以使用MyXXXActivityTaskManagerInternal提供的扩展接口。
ActivityTaskManagerService.java
private void start() {
LocalServices.addService(ActivityTaskManagerInternal.class, mInternal);
LocalServices.addService(MyXXXActivityTaskManagerInternal.class, new MyXXXActivityTaskManagerInternal());
}
/**
* @hide
*/
public final class MyXXXActivityTaskManagerInternal {
public ActivityRecord getFocusedApp() {
DisplayContent topFocusedDisplay = mRootWindowContainer.getTopFocusedDisplayContent();
ActivityRecord focusedApp = topFocusedDisplay.mFocusedApp;
return focusedApp;
}
}
XXXDemo.java
MyXXXActivityTaskManagerInternal myXXXActivityTaskManagerInternal
= LocalServices.getService(MyXXXActivityTaskManagerInternal.class);
return myXXXActivityTaskManagerInternal.getFocusedApp().