Service的启动和绑定过程

  • Service的启动过程
    • 一.ContextImpl调用AMS
      • ContextWrapper.java中startSevice方法的执行过程:
      • ContextImpl.java中startService的执行过程:
      • startServiceCommon方法的执行过程:
    • 二.ActivityThread启动Service
      • ActivityManagerService.java中startService方法的执行过程:
      • ActiveServices.java中startServiceLocked方法的执行过程:
      • startServiceInnerLocked方法的执行过程:
      • bringUpServiceLocked方法的执行过程:
      • realStartServiceLocked方法的执行过程:
      • ActivityThread.java中scheduleCreateService方法的执行过程:
      • handleMessage方法的执行过程:
      • ActivityThread.java中handleCreateService方法的执行过程:
  • Service的绑定过程
    • 一.ContextImpl调用AMS
      • ContextWrapper.java中bindSevice方法的执行过程:
      • ContextImpl,java中bindService的执行过程:
      • bindServiceCommon方法的执行过程:
    • 二.AMS绑定Service
      • ActivityManagerService.java中bindService方法的执行过程:
      • ActiveServices.java中bindServiceLocked方法执行过程:
      • requesServiceBindingLocked方法的执行过程:
      • ActivityThread.java中scheduleBindService方法的执行过程:
      • handleMessage方法的执行过程:
      • ActivityThread.java中handleBindMessage方法的执行过程:
    • 三.AMS回调ServiceConnection
      • ActivityManagerService.java中publishService方法的执行过程:
      • ActiveServices.java中publishServiceLocked方法的执行过程:
      • LoadedApk.java中InnerConnection类connected方法的执行过程:
      • LoadedApk.java中ServiceDispatcher类connected方法的执行过程:
      • LoadedApk.java中RunConnection类中run方法的执行过程:
      • LoadedApk.java中doConnected方法的执行过程:

Service的启动过程

一.ContextImpl调用AMS

      要启动Service,需要调用startService方法,该方法在ContextWrapper.java中实现。

ContextWrapper.java中startSevice方法的执行过程:

      调用Context对象的startService方法。
      该Context对象为启动ActivityThread时调用createBaseContextForActivity方法返回的ContextImpl对象。

ContextImpl.java中startService的执行过程:

      调用startServiceCommon方法。

startServiceCommon方法的执行过程:

      1.调用ActivityManager的getService方法获取AMS的代理IActivityManager对象。
      2.调用AMS对象的startService方法。

二.ActivityThread启动Service

ActivityManagerService.java中startService方法的执行过程:

      调用ActiveServices对象的startServiceLocked方法。

ActiveServices.java中startServiceLocked方法的执行过程:

      1.调用retrieveServiceLocked方法,返回ServiceLoopupResult对象。
      该方法会检查是否有与要启动Service对应的ServiceRecord对象,ServiceRecord用于描述一个Service。若没有则会调用PMS获取要启动的Service的信息,并封装到ServiceRecord对象中,最后将ServiceRecord对象封装成ServiceLoopupResult对象。
      2.调用ServiceLookupResult对象的成员变量record获取ServiceRecord对象。
      3.调用startServiceInnerLocked方法,传入ServiceRecord对象作为参数。

startServiceInnerLocked方法的执行过程:

      调用bringUpServiceLocked方法。

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的应用程序进程。

realStartServiceLocked方法的执行过程:

      1.调用ProcessRecord对象的成员变量thread获取ApplicationThread对象。
      2.调用ApplicationThread对象的scheduleCreateService方法。

ActivityThread.java中scheduleCreateService方法的执行过程:

      1.创建CreateServiceData对象,并将Service的启动参数封装到其中。
      2.调用sendMessage方法,向H类发送类型为CREATE_SERVICE的消息,并将CreateServiceData对象传递过去。

      sendMessage方法内部调用H对象的sendMessage方法,最终在ActivityThread.java中H类的handleMessage方法中处理。

handleMessage方法的执行过程:

      调用handleCreateMessage方法。

ActivityThread.java中handleCreateService方法的执行过程:

      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的绑定过程

一.ContextImpl调用AMS

      要绑定Service,需要调用bindService方法,该方法在ContextWrapper.java中实现。

ContextWrapper.java中bindSevice方法的执行过程:

      调用Context对象的bindService方法。
      该Context对象为启动ActivityThread时调用createBaseContextForActivity方法返回的ContextImpl对象。

ContextImpl,java中bindService的执行过程:

      调用bindServiceCommon方法。

bindServiceCommon方法的执行过程:

      1.调用LoadedApk对象的getServiceDispatcher方法,传入ServiceConnection对象作为参数,返回IServiceConnection对象
该方法使Service的绑定支持跨进程。
      2.调用ActivityManager的getService方法获取AMS的代理IActivityManager对象。
      3.调用AMS对象的bindService方法。

二.AMS绑定Service

ActivityManagerService.java中bindService方法的执行过程:

      调用ActiveServices对象的bindServiceLocked方法。

ActiveServices.java中bindServiceLocked方法执行过程:

      1.调用ServiceRecord对象的retrieveAppBindingLocked方法获取AppBindRecord对象。
      应用程序进程通过Intent绑定Service时,会通过AppBindRecord来维护Service和应用程序进程的关联
            1).创建IntentBindRecord对象。
            IntentBindRecord用于描述绑定Service的Intent,AMS会为每个绑定Service的Intent分配一个IntentBindRecord对象。IntentBindRecord内部有一个类型为ArrayMap的对象,用来记录使用当前Intent对象绑定Service的应用程序进程。
            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。

requesServiceBindingLocked方法的执行过程:

      1.调用ServiceRecord对象的成员变量app获取ProcessRecord对象。
      2.调用ProcessRecord对象的成员变量thread获取ApplicationThread对象。
      3.调用ApplicationThread对象的scheduleBindService方法。

ActivityThread.java中scheduleBindService方法的执行过程:

      1.创建BindServiceData对象,并把Service的信息封装到其中。
      2.调用sendMessage方法,向H类发送类型为BIND_SERVICE的消息,并将BindServiceData对象传递过去。

      sendMessage方法内部调用H对象的sendMessage方法,最终在ActivityThread.java中H类的handleMessage方法中处理。

handleMessage方法的执行过程:

      调用handleBindMessage方法。

ActivityThread.java中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方法。

三.AMS回调ServiceConnection

ActivityManagerService.java中publishService方法的执行过程:

      调用ActiveServices对象的publishServiceLocked方法。

ActiveServices.java中publishServiceLocked方法的执行过程:

      调用IServiceConnection对象的connected方法。
      IServiceConnection是ServiceConnection在本地的代理,用于解决Service跨进程通信问题,具体实现为ServiceDispatcher.InnerConnection。ServiceDispatcher是LoadedApk的内部类。

LoadedApk.java中InnerConnection类connected方法的执行过程:

      调用ServiceDispatcher对象的connected方法。

LoadedApk.java中ServiceDispatcher类connected方法的执行过程:

      创建RunConnection对象作为参数,调用Handler对象的post方法。

LoadedApk.java中RunConnection类中run方法的执行过程:

      调用doConnected方法。

LoadedApk.java中doConnected方法的执行过程:

      调用ServiceConnection对象的onServiceConnected方法。

更多相关文章

  1. 修改android项目sdk版本的方法
  2. Android中文API(128) —— HandlerThread
  3. Android(安卓)布局加载源代码分析
  4. Android的android.os.DeadObjectException异常
  5. android dialog用法汇总
  6. Android(安卓)Your content must have a ListView whose...
  7. 浅谈Java中Collections.sort对List排序的两种方法
  8. 类和 Json对象
  9. Python list sort方法的具体使用

随机推荐

  1. android常见框架基本使用之-AsyncHttpCli
  2. Android 漂亮的 Dialog (弹出框)
  3. Android 网络编程---STRUTS2,JSON,HttpCli
  4. AsyncTask
  5. Android开发者珍藏必备【学习资料篇】
  6. Android 应用进程保活APP常驻内存研究方
  7. android录屏功能
  8. Android存在程序缺陷误发短信 Google形象
  9. Android(安卓)返回键连续点击两次退出应
  10. Android――带文字阴影效果的TextView