深入AMS源码(一)——ActivityManagerService的基础知识

本文从源码角度探讨Android的ActivityManagerService(AMS),首先介绍了AMS的重要数据结构,如ActivityStack、TaskRecord和ActivityStack管理。接着详细阐述了AMS的启动过程,包括由SystemServer启动并在ActivityManagerService.start()方法中完成初始化。最后,简述了AMS如何管理Activity的生命周期,使用模板模式执行生命周期回调。下篇将继续分析AMS如何调度Activity。

自从读过Android内核剖析这本书之后,对整个安卓的系统有了更深的认识和理解,前面写了3篇文章(深入PMS源码)分析了PMS的相关代码,之后会将相关知识都整理在博客上,本篇开始将从源码角度分析AMS的执行逻辑,AMS作为Android的核心服务,了解其内部流程会让开发者对程序的执行有更深刻的认识,主要的流程逻辑放在下一篇中分析,这里先分析下基础部分便于更好的理解之后的内容;

1、AMS重要数据结构

  • Activity栈模型
    在这里插入图片描述
  1. 每个活动Activity在AMS中都会创建对应的ActivityRecord对象;
  2. 这些ActivityRecord对象被管理在各自的任务栈中,每个TaskStack可以添加多了任务对象;
  3. 所有的TaskStack都被ActivityStack统一管理,负责TaskStack的顺序、入栈和出栈;
  • ActivityRecord:记录所有Activity的信息,属性如下:
  1. service:ActivityManagerService的引用
  2. info:Activity注册的全部信息
  3. appInfo:此活动对应的应用程序信息
  4. launchedFromPackage:启动此Activity程序对应的包名
  5. app:所在进程信息ProcessRecord对象
  6. launchMode:启动模式
  7. task:此Activity所属的任务栈,TaskRecord
  8. taskAffinity:Activity设置的归属栈名称
  9. packageName:包含Activity的包名
  10. processName:程序的进程名称
  11. userId:当前活动运行所在的用户ID
  12. ActivityRecord resultTo:此活动需要回复数据的ActivityRecord对象
  13. requestCode:请求的状态码
  14. Bundle icicle:保存Activity的数据
  15. state:Activity的当前状态
  16. icon:应用程序图标Icon
  17. logo:应用程序图标Logo
  18. theme:应用程序图标theme
  19. labelRes:应用程序图标labelRes
  • TaskRecord:Activity所属的任务栈
  1. AMS中使用任务栈记录每个Activity的状态和启动顺序,使每个Activity都有各自的任务栈,在执行启动和退出时可以在栈中有序进行;
  2. 默认A启动新的ActivityB,那新的B就加入A所在的任务栈中;
  • TaskRecord属性:
  1. taskId:任务栈的Id,唯一标志
  2. affinity:任务栈的倾向性名称
  3. intent:启动这个栈的Intent意图
  4. userId:此栈所属的用户ID
  5. mActivities:任务栈中所有的Activity信息
  6. mStack:当前的栈所属的管理类ActivityStack对象
  7. mService:保存AMS引用
  • ActivityStack:Activity的栈管理类,管理进程中所有的TaskRecord对象
  1. mService:AMS引用
  2. mWindowManager:WMS引用
  3. ArrayList mTaskHistory:所有的活动历史记录栈,集合中最顶的栈为当前栈
  4. mLRUActivities:保存最近最少使用的活动
  5. mPausingActivity:保存正在暂停的Activity
  6. mLastPausedActivity:最近一个已经Paused状态的活动
  7. mResumedActivity:当前正在运行的活动
  8. mLastNoHistoryActivity:最近一个NoHistory的活动
  9. mStackId:栈管理的id
  10. mHandler:ActivityStackHandler对象,执行Handler消息事件

2、AMS的启动过程

AMS作为系统的主要服务,也是在Android系统启动后由系统来启动,由Android系统启动过程知道系统启动服务通过SystemServer完成,在SystemServer中调用startBootstrapServices()启动核心服务,AMS也是在此方法中完成启动

private void startBootstrapServices() {
   
   
559        mActivityManagerService = mSystemServiceManager.startService(
560                ActivityManagerService.Lifecycle.class).getService(); //1、使用SystemServiceManager创建AMS对象
561        mActivityManagerService.setSystemServiceManager(mSystemServiceManager); //赋值AMS中mSystemServiceManager
562        mActivityManagerService.setInstaller(installer); //赋值AMS中的installer
}

上面的代码也是在Android系统启动过程中出现过的,使用SystemServiceManager.startService()方法,传入ActivityManagerService.Lifecycle.class启动服务,由前面的学习知道startService()方法中会创建Lifecycle对象,并调用onStart()方法

public static final class Lifecycle extends SystemService {
   
   
    private final ActivityManagerService mService;
    public Lifecycle(Context context) {
   
   
        super(context);
        mService = new ActivityManagerService(context); // 1、创建AMS对象
    }
    @Override
    public void onStart() {
   
   
        mService.start(); // 2、执行start()方法
    }
    public ActivityManagerService getService() {
   
    // 3、返回AMS对象
        return mService;
    }
}

在Lifecycle的构造函数中直接创建ActivityManagerService对象,然后调用ActivityManagerService.start()方法

  • ActivityManagerService构造函数
public ActivityManagerService(Context systemContext) {
   
   
mSystemThread = ActivityThread.currentActivityThread(); // 1、获取ActivityThread实例
mHandlerThread = new ServiceThread(TAG, THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
mHandlerThread.start();

mHandler = new MainHandler(mHandlerThread.getLooper()); // 2、使用HandlerThread初始化一个线程和Handler对象
mProcStartHandlerThread = new ServiceThread(TAG + ":procStart”, // 3、初始化用于进程启动的ProcStartHandle对象
        THREAD_PRIORITY_FOREGROUND, false /* allowIo */);
mProcStartHandlerThread.start();

mProcStartHandler = new Handler(mProcStartHandlerThread.getLooper());
if (sKillHandler == null) {
   
   
    sKillThread = new ServiceThread(TAG + ":kill",
            THREAD_PRIORITY_BACKGROUND, tru
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值