Android - Service启动机制

 

以下资料摘录整理自老罗的Android之旅博客,是对老罗的博客关于Android底层原理的一个抽象的知识概括总结(如有错误欢迎指出)(侵删):
http://blog.csdn.net/luoshengyang/article/details/8923485
http://blog.csdn.net/luoshengyang/article/details/12957169

整理by Doing

 

在新进程中启动自定义服务过程(startService)

Activity的类图
《Android - Service启动机制》         从图中可以看出,Activity继承了ContextWrapper类,而在ContextWrapper类中,实现了startService函数。在ContextWrapper类中,有一个成员变量mBase,它是一个ContextImpl实例,而ContextImpl类和ContextWrapper类一样继承于Context类,ContextWrapper类的startService函数最终过调用ContextImpl类的startService函数来实现。这种类设计方法在设计模式里面,就称之为装饰模式(Decorator),或者包装模式(Wrapper)。         在ContextImpl类的startService类,最终又调用了
ActivityManagerProxy类的startService来实现启动服务的操作
ActivityManagerProxy是一个Binder对象的远程接口了,而这
个Binder对象就是我们前面所说的ActivityManagerService了。  
    
    
ActivityManagerService类Binder进程间通信机制中的Server角色,它是随机启动的。随机启动的Server是SystemServer.java文件里面进行启动的:首先是调用ActivityManagerService.main函数来
创建一个ActivityManagerService实例
,然后通过调用ActivityManagerService.setSystemProcess函数
把这个Binder实例添加Binder进程间通信机制的守护进程ServiceManager中去
 
    
    
在主进程调用startService函数时,会通过Binder进程间通信机制来通知ActivitManagerService来创建新进程,并且启动指定的服务。
通过三次Binder进程间通信完成服务的启动过程: 一. 从主进程调用到ActivityManagerService进程中,完成新进程的创建; 二. 从新进程调用到ActivityManagerService进程中,获取要在新进程启动的服务的相关信息; 三. 从ActivityManagerService进程又回到新进程中,最终将服务启动起来。  

在应用程序进程内部启动Service(bindService)的方法

在应用程序的MainActivity的onCreate函数中,会调用bindService来绑定一个计数器服务CounterService:
    
    
绑定的意思其实就是在MainActivity内部获得CounterService的接口。所以,
第一步就是要把CounterService启动起来。当CounterService的onCreate函数被调用起来了,就说明CounterService已经启动起来了,接下来系统还要调用CounterService的onBind函数,跟CounterService要一个Binder对象,这个Binder对象是在CounterService内部自定义的CounterBinder类的一个实例,它继承于Binder类,里面实现一个getService函数,用来返回外部的CounterService接口。系统得到这个Binder对象之后,就会调用MainActivity在bindService函数里面传过来的ServiceConnection实例的onServiceConnected函数,并把这个Binder对象以参数的形式传到onServiceConnected函数里面,于是,MainActivity就可以调用这个Binder对象的getService函数来获得CounterService的接口了。
整个调用过程为MainActivity.bindService->CounterService.onCreate->CounterService.onBind->MainActivity.ServiceConnection.onServiceConnection->CounterService.CounterBinder.getService
    Android应用程序绑定服务(bindService)的过程:

  1. MainActivity调用bindService函数通知ActivityManagerServiceBinder进程间通信机制中的Server角色),它要启动CounterService这个服务,ActivityManagerService于是在MainActivity所在的进程内部把CounterService启动起来,并且调用它的onCreate函数
  2. ActivityManagerService把CounterService启动起来后,继续调用CounterService的onBind函数,要求CounterService返回一个Binder对象给它
  3. ActivityManagerService从CounterService处得到这个Binder对象后,就把它传给MainActivity,即:把这个Binder对象作为参数传递给MainActivity内部定义的ServiceConnection对象的onServiceConnected函数
  4. MainActivity内部定义的ServiceConnection对象的onServiceConnected函数在得到这个Binder对象后,就通过它的getService函数获得CounterService接口

  (对1的进一步解释:
Binder驱动机制

MainActivity调用bindService函数最终是
调用了ActivityManagerProxy.bindService,其中
ActivityManagerProxy是一个ActivityManagerService(Binder对象)的远程接口)      

    原文作者:_Doing
    原文地址: http://www.cnblogs.com/Doing-what-I-love/p/5530367.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞