美文网首页
Android Framework学习之系统服务和bind的应用

Android Framework学习之系统服务和bind的应用

作者: 一只二凡子 | 来源:发表于2020-11-09 12:46 被阅读0次

    1.它们在启动方式上有什么区别

    2.它们在注册方式上有什么区别

    3.它们在使用方式上有什么区别

    系统服务大多数是跑在SystemServer里的,也是在SystemServer里启动的,比如AMS,PMS,WMS等,大部分系统服务都是跑在binder线程里的,只有少部分的系统服务才会有自己的工作线程,启动服务主要是做一些服务的初始化工作,比如说准备好服务的binder实体对象,当client有请求过来时,就会在binder线程池里把请求分发给对应的binder实体对象,来进行处理,处理完之后再去发送回复给client,这就是系统服务的启动。跑在自己的工作线程中的系统服务一般都是native实现,有自己的main入口函数,需要自己去启动binder机制,去管理binder通信,它一样要有自己的binder实体对象,和之前的启动过程是一样的。

    应用服务启动 startServiceCommon(Intent service) -> ActivityManagerNative.getDefault().startService(service)->

    handleCreateService(CreateServiceData data)  

    AMS它只负责service的管理和调度,真正的service启动还是在应用端完成的。

    应用端:首先通过ClassLoad去加载service的类,然后newInstance()去构造service对象,然后给service创建上下文,准备Application,给service赋予上下文,最后进行service的生命周期回调。

    系统服务的注册无论你是跑在SystemServer进程还是一个单独进程的服务都是要给自己的binder实体对象注到ServiceManager的。

    应用服务的注册:首先应用向AMS发起bindServiec调用,AMS会看应用是否注册过,如果注册过,就直接给service的binder对象返回给应用,如果没注册过,AMS就会请求binder对象,Service就会响应这个请求,给自己的binder对象注册到AMS,然后AMS再把binder对象回调给应用。

    应用服务是一个典型的被动注册,一般是由应用来bindService。

    系统服务的使用可参见上篇文章 ServiceFetcher

    应用服务的使用,bindService(serviceIntent,new ServiceConnectioin(){})

    在回调的onServiceConnected函数中会返回一个binder对象,通过binder对象封装了一层业务接口对象 ,就可以通过业务接口对象使用这个应用服务了。

    相关文章

      网友评论

          本文标题:Android Framework学习之系统服务和bind的应用

          本文链接:https://www.haomeiwen.com/subject/ywslbktx.html