本文结合上文Android7.1 getSystemService流程梳理,android AIDL、ServiceManager等技术点,以WindowManagerService为例,讲讲如果我们需要在framework添加一个自定义的系统级服务,需要做的事情
1.定义一个抽象类或者接口WindowManager,给应用层提供可访问的接口
frameworks/base/core/java/android/view/WindowManager.java
2.定义一个final修饰的类WIndowManagerImpl,来实现WIndowManager中定义的接口,android中对WindowManagerImpl封多了一层,实际与服务端通信是借助与WindowManagerGlobal这个final类,实际自定义系统服务不一定要这么来
frameworks/base/core/java/android/view/WindowManagerImpl.java
frameworks/base/core/java/android/view/WindowManagerGlobal.java
3.新建一个AIDL接口文件IWindowManager.aidl,定义系统服务接口
frameworks/base/core/java/android/view/IWindowManager.aidl
4.新建一个WindowManagerService类,让其继承IWindowManager.Stub,并实现AIDL文件中定义的所有接口
frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java
public class WindowManagerService extends IWindowManager.Stub
5.在frameworks/base/core/java/android/content/Context.java中添加自定义服务的名字
public static final String WINDOW_SERVICE = "window";
6.将WindowManageService添加到ServiceManager中
frameworks/base/services/java/com/android/server/SystemServer.java
wm = WindowManagerService.main(context, inputManager,
mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
!mFirstBoot, mOnlyCore);
ServiceManager.addService(Context.WINDOW_SERVICE, wm);
7.在frameworks/base/core/java/android/app/ContextImpl.java中将WindoManager注册进哈希表中
registerService(Context.WINDOW_SERVICE, WindowManager.class,
new CachedServiceFetcher<WindowManager>() {
@Override
public WindowManager createService(ContextImpl ctx) {
return new WindowManagerImpl(ctx);
}});
8.在WindowManager的实现端,通过IWindowManager.Stub.asInterface取得WindowManagerService服务端的代理,通过代理,WindowManager就可以访问服务端提供的服务了
public static IWindowManager getWindowManagerService() {
synchronized (WindowManagerGlobal.class) {
if (sWindowManagerService == null) {
sWindowManagerService = IWindowManager.Stub.asInterface(
ServiceManager.getService("window"));
try {
sWindowManagerService = getWindowManagerService();
ValueAnimator.setDurationScale(sWindowManagerService.getCurrentAnimatorScale());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
return sWindowManagerService;
}
}
9.最后,对于应用程序,只要通过getSystemService方法,即可使用WindowManager提供的接口
WindowManager w = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
w.getDefaultDisplay().getMetrics(metrics);