深入理解Android AMS

在activity的启动过程中会调用Instrumentation的execStartActivity方法:

涉及代码:

Instrumentation.java    core\java\android\app\Instrumentation.java

 这里调用到了ActivityManager的getService方法:

ActivityTaskManager.java    core\java\android\app\ActivityTaskManager.java

 getService方法调用了IActivityTaskManagerSingleton的get方法,IActivityTaskManagerSingleton是一个Singleton类。

这里    public static final String ACTIVITY_TASK_SERVICE = "activity_task";

这里得到IBinder类型的AMS引用,然后将它转换为IActivityTaskManager类型的对象,采用的是AIDL.

要实现进程间通信,服务端也就是AMS只需继承IActivityTaskManager.Stub类并实现相应的方法即可

 ActivityManagergetService方法得到IActivityManager ,AMS只需要继承ActivityManager.Stub类就可以和ActivityManager实现进程间通信了

 

再看看AMS的启动过程:

AMS的启动是在SytemServer中启动的,从SystemServer的main方法看起:

代码:SystemServer.java    services\java\com\android\server\SystemServer.java

 main方法调用了SystemServer的run方法

private void run() {

 try {

....

 

 Looper.prepareMainLooper();//创建消息Looper
            Looper.getMainLooper().setSlowLogThresholdMs(
                    SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);

            // Initialize native services.
            System.loadLibrary("android_servers");//加载动态库

// Create the system service manager.
            mSystemServiceManager = new SystemServiceManager(mSystemContext);//创建SystemServiceManager
            mSystemServiceManager.setStartInfo(mRuntimeRestart,
                    mRuntimeStartElapsedTime, mRuntimeStartUptime);
            LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);

            startBootstrapServices();//启动引导服务
            startCoreServices();//启动核心服务
            startOtherServices();//启动其他服务

....

}

}

SystemServiceManager会对系统的服务进行创建、启动和生命周期管理

官方把系统服务分为了3种类型,分别是引导服务、核心服务和其他服务,其中其他服务是一些非紧要和不需要立即启动的服务。

我们主要看看引导服务AMS是如何启动的。

startBootstrapServices方法

SystemServer.java    services\java\com\android\server\SystemServer.java

private void startBootstrapServices() {

...

ActivityTaskManagerService atm = mSystemServiceManager.startService(
                ActivityTaskManagerService.Lifecycle.class).getService(); //调用了SystemServiceManager的getService

        mActivityManagerService = ActivityManagerService.Lifecycle.startService(
                mSystemServiceManager, atm);
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer);

...

}

SystemServiceManager.java    services\core\java\com\android\server\SystemServiceManager.java

 在Lifecycle的构造方法中创建了AMS的实例。当调用SystemService类型的service的onStart方法时,实际上调用了构造方法中AMS的start方法。

ssm.startService(ActivityManagerService.Lifecycle.class).getService();实际上得到的就是AMS实例

 

 

AMS与应用程序进程的关系:

1 启动应用程序时AMS会检查这个应用程序需要的应用程序进程是否存在

2 如果需要的应用程序进程不存在,AMS就会请求Zygote进程创建需要的应用程序进程

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值