要启动Service,需要调用startService方法,该方法在ContextWrapper.java中实现。
调用Context对象的startService方法。
该Context对象为启动ActivityThread时调用createBaseContextForActivity方法返回的ContextImpl对象。
调用startServiceCommon方法。
1.调用ActivityManager的getService方法获取AMS的代理IActivityManager对象。
2.调用AMS对象的startService方法。
调用ActiveServices对象的startServiceLocked方法。
1.调用retrieveServiceLocked方法,返回ServiceLoopupResult对象。
该方法会检查是否有与要启动Service对应的ServiceRecord对象,ServiceRecord用于描述一个Service。若没有则会调用PMS获取要启动的Service的信息,并封装到ServiceRecord对象中,最后将ServiceRecord对象封装成ServiceLoopupResult对象。
2.调用ServiceLookupResult对象的成员变量record获取ServiceRecord对象。
3.调用startServiceInnerLocked方法,传入ServiceRecord对象作为参数。
调用bringUpServiceLocked方法。
1.调用ServiceRecord对象的成员变量processName获取Service想要运行的进程。
默认为当前进程,可以在AndroidManifest中设置android:process属性指定一个新进程。
2.调用getProcessRecordLocked方法,传入processName和Service的uid作为参数,获取ProcessRecord对象。
3.若ProcessRecord对象不为null,即Service运行的进程存在,则调用realStartServiceLocked方法启动Service。
4.若ProcessReocrd对象为null,即Service运行的进程不存在,则调用AMS对象的startProcessLocked方法启动Service的应用程序进程。
1.调用ProcessRecord对象的成员变量thread获取ApplicationThread对象。
2.调用ApplicationThread对象的scheduleCreateService方法。
1.创建CreateServiceData对象,并将Service的启动参数封装到其中。
2.调用sendMessage方法,向H类发送类型为CREATE_SERVICE的消息,并将CreateServiceData对象传递过去。
sendMessage方法内部调用H对象的sendMessage方法,最终在ActivityThread.java中H类的handleMessage方法中处理。
调用handleCreateMessage方法。
1.调用getPackageInfoNoCheck方法获取要启动Service的应用程序的LoadedApk对象。
2.调用LoadedApk对象的getClassLoader方法获取类加载器ClassLoader对象。
3.调用ClassLoader对象的loadClass方法获取Class对象,调用Class对象的newInstance方法获取Service对象。
4.调用ContextImpl的createAppContext方法,创建Service的上下文环境ContextImpl对象。
5.调用Service对象的attach方法初始化Service。
6.调用Service对象的onCreate方法。
7.将Service对象保存到ActivityThread中名为mServices的ArrayMap中。
要绑定Service,需要调用bindService方法,该方法在ContextWrapper.java中实现。
调用Context对象的bindService方法。
该Context对象为启动ActivityThread时调用createBaseContextForActivity方法返回的ContextImpl对象。
调用bindServiceCommon方法。
1.调用LoadedApk对象的getServiceDispatcher方法,传入ServiceConnection对象作为参数,返回IServiceConnection对象
该方法使Service的绑定支持跨进程。
2.调用ActivityManager的getService方法获取AMS的代理IActivityManager对象。
3.调用AMS对象的bindService方法。
调用ActiveServices对象的bindServiceLocked方法。
1.调用ServiceRecord对象的retrieveAppBindingLocked方法获取AppBindRecord对象。
应用程序进程通过Intent绑定Service时,会通过AppBindRecord来维护Service和应用程序进程的关联。
1).创建IntentBindRecord对象。
IntentBindRecord用于描述绑定Service的Intent,AMS会为每个绑定Service的Intent分配一个IntentBindRecord对象。IntentBindRecord内部有一个类型为ArrayMap
2).根据IntentBindRecord对象中保存的ProcessRecord对象获取AppBindRecord对象。
3).若AppBindRecord对象为null,则创建AppBindRecord对象。
2.调用bringUpServiceLocked方法启动Service。
3.若Service已经从运行,并且当前应用程序进程已经接收到绑定Service时返回的Binder对象,则调用IServiceConnection对象的connected方法。
4.若当前应用程序绑定过Service,则调用requestServiceBindingLocked方法,其中boolean类型的参数rebind为true。
5.若当前应用程序没有绑定过Service,则调用requestServiceBindingLocked方法,其中boolean类型的参数rebind为false。
1.调用ServiceRecord对象的成员变量app获取ProcessRecord对象。
2.调用ProcessRecord对象的成员变量thread获取ApplicationThread对象。
3.调用ApplicationThread对象的scheduleBindService方法。
1.创建BindServiceData对象,并把Service的信息封装到其中。
2.调用sendMessage方法,向H类发送类型为BIND_SERVICE的消息,并将BindServiceData对象传递过去。
sendMessage方法内部调用H对象的sendMessage方法,最终在ActivityThread.java中H类的handleMessage方法中处理。
调用handleBindMessage方法。
1.调用ActiveServices对象的get方法获取Service对象。
2.若是第一次绑定,即rebind为false。
1).调用Service对象的onBind方法,获取IBinder对象。
2).调用ActivityManager的getService方法获取AMS的代理IActivityManager对象。
3).调用AMS对象的publishService方法,回调通知Service,并将IBinder对象传递回去。
3.若不是第一次绑定,即rebind为true,则调用ServiceConnection对象的onRebind方法。
调用ActiveServices对象的publishServiceLocked方法。
调用IServiceConnection对象的connected方法。
IServiceConnection是ServiceConnection在本地的代理,用于解决Service跨进程通信问题,具体实现为ServiceDispatcher.InnerConnection。ServiceDispatcher是LoadedApk的内部类。
调用ServiceDispatcher对象的connected方法。
创建RunConnection对象作为参数,调用Handler对象的post方法。
调用doConnected方法。
调用ServiceConnection对象的onServiceConnected方法。