老罗Android之旅----Service、Activity学习笔记

Android系统在新进程中启动自定义服务过程(startService)的原理分析

Android系统应用在主进程调用startService函数时,会通过Binder进程间通信机制来通知ActivitManagerService来创建新进程,并且启动指定的服务。
这个ActivityManagerService类实现在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中,它是Binder进程间通信机制中的Server角色,它是随机启动的。随机启动的Server是在frameworks/base/services/java/com/android/server/SystemServer.java文件里面进行启动的,我们来看一下ActivityManagerService启动相关的代码:
class ServerThread extends Thread {  
    ......  
    @Override  
    public void run() {  
        ......  
        // Critical services...  
        try {  
            ......  
            context = ActivityManagerService.main(factoryTest);  
            ......  
            ActivityManagerService.setSystemProcess();  
            ......  
          
        } catch (RuntimeException e) {  
            Slog.e("System", "Failure starting core service", e);  
        }  
        ......  
    }  
    ......  
}  
首先是调用ActivityManagerService.main函数来创建一个ActivityManagerService实例,然后通过调用ActivityManagerService.setSystemProcess函数把这个Binder实例添加Binder进程间通信机制的守护进程ServiceManager中去:
public final class ActivityManagerService extends ActivityManagerNative  
        implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {  
  
    ......  
    static ActivityManagerService mSelf;  
    ......  
    public static void setSystemProcess() {  
        try {  
            ActivityManagerService m = mSelf;  
  
            ServiceManager.addService("activity", m);  
            ......  
        } catch (PackageManager.NameNotFoundException e) {  
            ......  
        }  
    }  
    ......  
  
    public static final Context main(int factoryTest) {  
        ......  
        ActivityManagerService m = thr.mService;  
        mSelf = m;  
        ......  
    }  
}  

这样,ActivityManagerService就启动起来了。
回到ActivityManagerProxy类的startService函数中,它定义在frameworks/base/core/java/android/app/ActivityManagerNative.java文件中:
class ActivityManagerProxy implements IActivityManager  
{  
    ......  
  
    public ComponentName startService(IApplicationThread caller, Intent service,  
        String resolvedType) throws RemoteException  
    {  
        Parcel data = Parcel.obtain();  
        Parcel reply = Parcel.obtain();  
        data.writeInterfaceToken(IActivityManager.descriptor);  
        data.writeStrongBinder(caller != null ? caller.asBinder() : null);  
        service.writeToParcel(data, 0);  
        data.writeString(resolvedType);  
        mRemote.transact(START_SERVICE_TRANSACTION, data, reply, 0);  
        reply.readException();  
        ComponentName res = ComponentName.readFromParcel(reply);  
        data.recycle();  
        reply.recycle();  
        return res;  
    }  
  
    ......  
}  

参数service是一个Intent实例,它里面指定了要启动的服务的名称
参数caller是一个IApplicationThread实例,它是一个在主进程创建的一个Binder对象。在Android应用程序中,每一个进程都用一个ActivityThread实例来表示,而在ActivityThread类中,有一个成员变量mAppThread,它是一个ApplicationThread实例,实现了IApplicationThread接口,它的作用是用来辅助ActivityThread类来执行一些操作
参数resolvedType是一个字符串,它表示service这个Intent的MIME类型,它是在解析Intent时用到的

ActivityManagerProxy类的startService函数把这三个参数写入到data本地变量去,接着通过mRemote.transact函数进入到Binder驱动程序,然后Binder驱动程序唤醒正在等待Client请求的ActivityManagerService进程,最后进入到ActivityManagerService的startService函数中。


下面是ActivityManagerService的startService函数的处理流程





Android应用程序启动过程源代码分析

在手机屏幕中点击应用程序图标的情景就会引发Android应用程序中的默认Activity的启动,从而把应用程序启动起来。这种启动方式的特点是会启动一个新的进程来加载相应的Activity,
下面我们试着画出Launcher启动应用程序的流程即MainActivity的启动过程:如下图示

这样,MainActivity就启动起来了,整个应用程序也启动起来了。

整个应用程序的启动过程要执行很多步骤,但是整体来看,主要分为以下五个阶段:

       一:Launcher通过Binder进程间通信机制通知ActivityManagerService,它要启动一个Activity;

       二:ActivityManagerService通过Binder进程间通信机制通知Launcher进入Paused状态;

       三:Launcher通过Binder进程间通信机制通知ActivityManagerService,它已经准备就绪进入Paused状态,于是ActivityManagerService就创建一个新的进程,用来启动一个ActivityThread实例,即将要启动的Activity就是在这个ActivityThread实例中运行;

       四:ActivityThread通过Binder进程间通信机制将一个ApplicationThread类型的Binder对象传递给ActivityManagerService,以便以后ActivityManagerService能够通过这个Binder对象和它进行通信;

       五:ActivityManagerService通过Binder进程间通信机制通知ActivityThread,现在一切准备就绪,它可以真正执行Activity的启动操作了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值