ActivityManagerService启动与基本功能

ActivityManagerService作为Android系统中的重要的系统服务之一,我们有必要来了解下。这篇文章就跟大家一起分析下它的创建、启动过程以及它的基本作用。

 如果大家看过前面的《Android App进程创建过程分析》《Android Activity启动过程分析》两篇文章,想必对ActivityManagerService(后面我们简称AMS)不会陌生,进程创建和Activity启动都有涉及到AMS。但是AMS又不只这些功能,下面我们就来了解下它的创建、启动过程以及它的基本功能。

创建与启动

 在了解AMS的功能之前,我们先来看下AMS的创建和启动过程。在SystemServer启动过程中会创建并启动一些系统服务,而AMS就是其中之一。AMS创建和启动整个过程如下图所示:

在这里插入图片描述

启动过程大致如下:

  • 在SystemServer的startBootstrapService()中调用ActivityManagerService静态内部类Lifecycle的startService()方法。
  • ActivityManagerService.Lifecycle.startService()最终通过SystemServiceManager.startService()方法创建ActivityManagerService.Lifecycle实例,并调用它的onStart()方法。
  • 在创建ActivityManagerSrevice.Lifecycle实例时会创建ActivityManagerService对象;在调用ActivityManagerService.Lifecycle.onStart()方法时会调用ActivityManagerService.start()方法。

接下来我们通过源码看下具体流程,首先看下SystemServer.startBootstrapServices()方法

//frameworks/base/services/java/com/android/server/SystemServer.java
private void startBootstrapServices() {
   
    //省略部分代码.......
    //start ActivityTaskManagerService
    ActivityTaskManagerService atm = mSystemServiceManager.startService(
            ActivityTaskManagerService.Lifecycle.class).getService();
    //start AMS,这里是通过ActivityManagerServerice的静态内部类Lifecycle的startService()方法实现的
    mActivityManagerService = ActivityManagerService.Lifecycle.startService(
            mSystemServiceManager, atm);
    mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
    mActivityManagerService.setInstaller(installer);
    //省略部分代码.......
}

注释用已做了说明,我们继续看下ActivityManagerService.Lifecycle类

//frameworks\base\services\core\java\com\android\server\am\ActivityManagerService.java
//ActivityManagerService.Lifecycle
public static final class Lifecycle extends SystemService {
   
    private final ActivityManagerService mService;
    private static ActivityTaskManagerService sAtm;

    public Lifecycle(Context context) {
   
        super(context);
        //在构造方法中调用ActivityManagerService构造方法,并传入Context和ActivityTaskManagerServiced
        mService = new ActivityManagerService(context, sAtm);
    }

    public static ActivityManagerService startService(
            SystemServiceManager ssm, ActivityTaskManagerService atm) {
   
        //给ActivityTaskManagerService类型静态变量sAtm赋值
        sAtm = atm;
        //调用SystemServiceManager.startService()方法得到Lifecycle对象
        //然后调用Lifecycle.getService()并返回ActivityManagerService对象。
        return ssm.startService(ActivityManagerService.Lifecycle.class).getService();
    }

    @Override
    public void onStart() {
   
        //调用ActivityManagerService.start()方法
        mService.start();
    }

    @Override
    public void onBootPhase(int phase) {
   
        mService.mBootPhase = phase;
        if (phase == PHASE_SYSTEM_SERVICES_READY) {
   
            mService.mBatteryStatsService.systemServicesReady();
            mService.mServices.systemServicesReady();
        } else if (phase == PHASE_ACTIVITY_MANAGER_READY) {
   
            mService.startBroadcastObservers();
        } else if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) {
   
            mService.mPackageWatchdog.onPackagesReady();
        }
    }

    @Override
    public void onCleanupUser(int userId) {
   
        mService.mBatteryStatsService.onCleanupUser(userId);
    }

    public ActivityManagerService getService() {
   
        return mService;
    }
}

startService(SystemServiceManager ssm, ActivityTaskManagerService atm)方法是通过调用SystemServiceManager.startService()方法来创建ActivityManagerSrevice对象的,所以我们看下SystemServiceManager.startService()方法的实现。

// /frameworks\base\services\core\java\com\android\server\SystemServiceManager.java
@SuppressWarnings("unchecked")
public <T extends SystemService> T startService(Class<T> serviceClass) {
   
    try {
   
        final String name = serviceClass.getName();
        Slog.i(TAG, "Starting " + name);
        Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartService " + name);

        // Create the service.
        if (!SystemService.class.isAssignableFrom(serviceClass)) {
   
            throw new RuntimeException("Failed to create " + name
                    + ": service must extend " + SystemService.class.getName());
        }
        final T service;
        try {
   
            Constructor<T> constructor = serviceClass.getConstructor(Context.class);
            //创建SystemService实例
            service = constructor.newInstance(mContext);
        } catch (InstantiationException ex) {
   
            throw new RuntimeException("Failed to create service " + name
                    + ": service could not be instantiated", ex);
        } catch (IllegalAccessException ex) {
   
            throw new RuntimeException("Failed to create service " + name
                    + ": service must have a public constructor with a Context argument", ex);
        } catch (NoSuchMethodException ex) {
   
            throw new RuntimeException("Failed to create service " + name
                    + ": service must have a public constructor with a Context argument", ex);
        } catch (InvocationTargetException ex) {
   
            throw new RuntimeException("Failed to create service " + name
                    + ": service constructor threw an exception", ex);
        }
        //调用startService的重载方法
        startService(service);
        return service;
    } finally {
   
        Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
    }
}

public void startService(@NonNull final SystemService service) {
   
    // Register it.
    // 加入到缓存列表
    mServices.add(service);
    // Start it.
    long time = SystemClock.elapsedRealtime();
    try {
   
        //调用onStart()方法
        service.onStart();
    } catch (RuntimeException ex) {
   
        throw new RuntimeException("Failed to start service " + service.getClass().getName()
                + ": onStart threw an exception", ex);
    }
    warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStart");
}

在这个过程主要做了以下几件事:

  • 通过反射创建ActivityManagerService.Lifecycle实例(会调用Lifecycle构造方法),并将它加入到SystemServiceManager中的mService列表缓存。
  • 调用ActivityManagerService.Lifecycle.onStart()方法。

在创建ActivityManagerService.Lifecycle实例和调用onStart()方法时,会分别创建AMS实例和调用AMS.start()方法。

//frameworks\base\services\core\java\com\android\server\am\ActivityManagerService.java
public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) {
   
    LockGuard.installLock(this
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值