Service创建过程
service一共有两种启动方式,一种为Bind绑定方式,这种方式一般用于与其他组件之间的交互,另一种方式是启动方式Start,这种方式一般用于执行后台任务。当然你也可以两种方式一起使用。
startService
Service的创建使用ContextImpl,通过调用它的房网完成第一步操作。
之后会调用AMS的startService,然后是ActiveServices,这个类是辅助AMS管理Service的类。
随后调用app.thread的scheduleCreateService方法,此方法中会通过H向ActivityThread发送Message,之后转至ActivityThread中进行处理,方法为ActivityThread的handleCreateService,可以看出和Activity的创建过程很像。
bindService
bindService和startService的差别还是很大的,因为bindSevice在完成绑定之后,Service会返回一个Binder对象,客户端通过ServiceConnection获得该对象完成与Service通信。
具体差别在AMS调用的不是startService而是其bindService方法,而在这之前,系统自动为我们将ServiceConnection包装为ServiceDispather。
由于Service可能不在同一个进程中,如果完成绑定则需要跨进程回调ServiceConnection的onServiceConnected方法,故这里需要一个Binder,而ServiceDispather的内部类InnerConnection正好充当了这个Binder。
之后还是ApplicationThread中通过H发送Message。
在ActivityThread的handleBindService方法中完成Service的创建,并且调用Service的onBind方法,将返回的Binder通过AMS的publishService方法完成调用客户端的onServiceConnected。
Service s = mService.get(data.token);
//省略
IBinder binder = s.obBind(data.intent);
ActivityManagerNative.getDefault().publishService(data.token, date.intent, binder);
//AMS的publishService会通过InnerConnection方法调用ServiceConnection的onServiceConnected方法。