一个系统服务(2种)是如何启动的

2019-10-16  本文已影响0人  六月小微风Online
1. 系统服务和应用服务的区别。
2. 反思:如果要自己设计一个系统服务,要考虑什么?

(1)如何让别人很方便的使用(拿到binder对象)
(2)如何将自己的服务开放出去(参考注册到SM的方案)
(3)IPC
(*4)客户端的设计:添加一个fetcher缓存service(可以选择Service[]数组作为存储),fetcher和name是一对Map

getSystemService(String name){
//1.由name获取  ServiceFetcher。Map.put(name,fetcher);
//2.再通过fetcher.getServie()
}
3. 应用端真正获取系统服务的过程

系统服务用起来很方便,知道其名字Context.ACTIVITY_SERVICE就可以使用了。但是它的真正实现还是有些复杂的。

private static final Singleton<IActivityManager> IActivityManagerSingleton =
            new Singleton<IActivityManager>() {
                @Override
                protected IActivityManager create() {
                    //在ServiceManager端返回binder代理
                    final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);

                    //AIDL生成Stub类
                    final IActivityManager am = IActivityManager.Stub.asInterface(b);
                    return am;
                }
            };
4. 如何将系统服务注册到ServiceManager

(1)在Service操作IServiceManager,传入的是binder实体
getIServiceManager.addService(name,service,……);
(2)而在ServiceManager端收到的是Service的代理binder对象

第一类系统服务的注册时机是SystemServer启动的时候:

第二类系统服务(native)的注册时机
在init.rc中添加其配置

5. 启动Binder机制

可以启动一个线程,注册为binder线程,如果打印tid列表,可以看到很多binder线程

上一篇下一篇

猜你喜欢

热点阅读