Service组件研究

来源:互联网 发布:js文本框只能输入整数 编辑:程序博客网 时间:2024/05/17 04:28

Android四大组件之Service

Service启动过程

1. 相关简介

ActiveServices: 管理所有services
启动过程通过context->AMS->ActiveServices实现
通过ActivityThread的applicationThread实现
process的回调
activityThread中的token为AMS中ProcessRecord的远端
activityThread中有mServices存放了该进程下的所有service,以toke binder作为key,该token为AMS对应的ServiceRecord

2. 流程

Created with Raphaël 2.1.0ContextImplContextImplActivityManagerServiceActivityManagerServiceActiveServicesActiveServicesActiveServiceActiveServiceActivityThreadActivityThreadstartServicestartService传入ApplicationThread和userIDstartServiceLockedretrieveServiceLocked在ActiveServices mServiceMap中是否存在该service,mServiceMap根据uid保存startServiceInnerLockedbringUpServiceLocked如果该进程已经存在,直接调用realStartServiceLocked,否则需要通过AMS启动新的进程startProcessLockedmainattachApplicationattachApplicationLockedattachApplicationLockedrealStartServiceLockedscheduleCreateServicehandleCreateService加载service的class信息serviceDoneExecutingserviceDoneExecutingLocked

Service绑定过程

1. 相关简介

ServiceRecord: 描述一个正在运行的service,其中bindings描述目前绑在该service的intent集合
connections存放所有的service connection
ServiceRecord包含:
- 一个IntentBindRecord的list,每个IntentBindRecord中存放了一个intent和对应的service的binder,以及以这个intent绑定的AppBindRecord的list
- 一个ConnectionRecord的hashmap,该hashmap以ServiceConnection的binder对象为key,存放了以改binder绑定的CR对象。一个CR对象内部有一个AppBindRecord,activity以及ConnectionService对象(封装成了ServiceDispatcher)。
IntentBindRecord: intent和service和app的绑定关系,存放了intent和service的对应关系,以及绑定在该service上的所有app和process
AppBindRecord: 描述service和client的绑定关系,存放在IntentBindRecord
ConnectionRecord: 描述一个service的绑定,包含activity信息等等。描述AppBindRecord到ServiceRecord的绑定关系。即使相同的AppBindRecord(app与service的一个绑定),activity不同也算两个ConnectionRecord,考虑到同一个ServiceConnection可能被不同的activity共用

2. 流程

Created with Raphaël 2.1.0ContextImplContextImplActivityManagerServiceActivityManagerServiceActiveServicesActiveServicesServiceDispatcherServiceDispatcherServiceRecordServiceRecordActivityThreadActivityThreadActivityManagerServicesActivityManagerServices(LoadApk)InnerConnection(LoadApk)InnerConnectionServiceConnectionServiceConnectionbindServicebindServiceCommonbindServicebindServiceLockedretrieveServiceLockednew保存了service与intent,app,Process的对应关系retrieveAppBindingLocked保存app信息bringUpServiceLockedrealStartServiceLocked此时Process已经启动,AMS中能获取到该Process,直接启动ServicescheduleCreateService新启动的Process的ActivityThreadhandleCreateServicerequestServiceBindingsLockedrequestServiceBindingLocked遍历绑定每个intentscheduleBindServicehandleBindServicepublishServicepublishServiceLocked发布service,IntentBindRecord记录绑定成功connectedconnectedsd中的该handler在bindServiceCommon设过,为ActivityThread中的mH,因此会将RunConnection传递到activityThread中执行doConnectedonServiceConnected
0 0
原创粉丝点击