AMS(ActivityManagerService)简述

一、什么是AMS?

    AMS全称:ActivityManagerService,通过activity Stack保存、管理、记录Android四大组件的状态(生命周期),提供查询服务功能的一个系统服务。它是在系统开启的时候由systemServer启动一个线程来开启的,

/*frameworks/base/services/java/com/android/server/SystemServer.java*/
public void run(){
	...
	Slog.i(TAG,"Activity Manager");
	context = ActivityManagerService.main(factroyTest);//启动AMS
	...
	ActivityManagerService.setSystemProcess()//向ServiceManager注册
	...
}

ActivityManagerService 提供了一个静态main函数,启动AMS,再调用setSystemProcess函数将AMS这个系统服务注册到ServiceManager,接下来我们看看AMS中main函数的实现,

/*frameworks/base/services/java/com/android/server/am/ActivityManagerService.java*/
public static final Context main(int factroyTest){
	AThread thr = new AThread();//创建AMS线程
	thr.start();
	synchronized(thr){
		white(thr.mservice == null){
			thr.wait();
		}
	}
	...
	m.mMainStack = new ActivityStack(m,context,true);//创建ActivityStack对象,这个是AMS的核心
	...
	reture context;
}

当SystemServer调用AMS的main函数创建一个AThread线程时,首先让这个线程wait等待,只有线程的MService成功赋值后,才被唤醒,从而使SystemServer正常使用AMS,notify的操作就在线程内部

static class AThread extend Thread{
	public void run(){
		...
		synchronized(this){
			MService = m;
			mLooper = Looper.myLooper();
			notifyAll();
		}
		...
	}
}

上面的notifyAll会唤醒所有在thr这个object所在等待队列上的目标,也就包括了SystemServer所属的线程。将AMS注册到ServiceManager也很方便,只是它布置注册了自己一个server,包括一系列与进程管理相关的服务,

public static void setSystemProcess(){
	ActivityManagerService m = mSelf;
	ServiceManager.addService(“activity”,m,true);
	ServiceManager.addService(“meminfo”,newMEMBinder(m));//内存使用情况
}

想要了解AMS提供的所有功能,最好是查看IActivitymanager.java。AMS所做的工作都是围绕这份接口声明展开的,AMS大致有以下几种功能:
1、组件状态管理:
需要注意的是,这里所说的组件不仅仅是指Activity,而是Android所属的四大组件。其状态管理包括组件的开启、关闭等等一系列的操作,例如:startActivity、startActivityAndWait、activityPause的、startService、stopService、removeProvider等等
2、组件状态查询:
这类函数用于查询组件当前运行情况,如getCallingActivity、getService等。
3、Task相关 Task相关我们会在接下来详细叙说
4、其他,AMS还提供了不少辅助功能,如系统运行时信息的查询getMemoryInfo,setDebugAPP等

二、ActivityStack,管理当前系统中activity的状态

1、ActivityStack描述了activity所经历的所有状态,当中有一系列不同功能的ArrayList成员变量,它们都在activityRecord这个类中,
2、记录了每个Activity的运行时信息,其中有几个重要的ArrayList

ArrayListDescription
MHistory所有Activity的信息都在这里有记录,直到它被destroy
mLRUActivities正在运行的Activity的列表集合,以最近的使用情况来排序,即队头元素是最近使用最少的元素
mStoppingActivity列表中的Activity已经可以被stop,但是还得等待下一个Activity处于就绪状态

3、除了上述ArrayList用来描述各种状态下的Activity集合外,ActivityStack还通过以下多个变量来专门记录一些特殊状态的Activity实例,

ArrayRecordDescription
mPausingActivity当前正在被暂停的(pausing)Activity
mLastPausedActivity上一个被暂停的Activity
mLastStartActivity最近一个被启动的Activity

上述3类变量构成了ActivityStack的主框架,因此用一句话来概括AMS,就是通过ActivityStack来记录、管理系统中所有的Activity和其他组件的状态,并提供一系列的查询功能,这句话包含以下几点

  1. AMS的主要工作就是管理、记录、查询
  2. AMS是系统进程的一部分,确切的说它运行于一个独立的线程。

上述基本是AMS的官方定义,究竟其如何管理组件,我们可以从startActivity一窥其貌,至于说为何选择startActivity流程,很简单AMS主要功能是管理Activity,显然跳转Activity的流程它必然都要参与。
先大致梳理一下startActivity所经历的函数调用流程,从调用方(startActivity1)开始:startActivity1->startActivity@ContextImpl->execStartActivity@Instrumentation->startActivity@ActivityManagerService,从这个调用链可以看出,经过一系列调用后最终指向的AMS的startActivity函数。
AMS中执行跳转大致有五个函数,长相差不多,首先列举出来:

  1. startActivity@ActivityManagerService.java
  2. startActivityasuser@ActivityManagerService.java
  3. startActivityMayWait@ActivityStack.java
  4. startActivitylocked@ActivityStack.java
  5. startActivityUnCheckedLocked@ActivityStack.java

一、startActivity@ActivityManagerService.java函数中就是跳转到startActivityasuser@ActivityManagerService.java

 @Override
    public final int startActivity(IApplicationThread caller, String callingPackage,
            Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
            int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {
        return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
                resultWho, requestCode, startFlags, profilerInfo, bOptions,
                UserHandle.getCallingUserId());
    }

可以看到startActivityAsUser就比startActivit多了一个UserId参数,它表示调用者的用户ID,
二、startActivityAsUser,这个函数主要是做权限检查,

  1. 检查调用者是否被隔离的对象
  2. 检查调用者是否有权利执行操作
@Override
    public final int startActivityAsUser(IApplicationThread caller, String callingPackage,
            Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
            int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) {
        enforceNotIsolatedCaller("startActivity");
        userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
                userId, false, ALLOW_FULL_ONLY, "startActivity", null);
        // TODO: Switch to user app stacks here.
        return mActivityStarter.startActivityMayWait(caller, -1, callingPackage, intent,
                resolvedType, null, null, resultTo, resultWho, requestCode, startFlags,
                profilerInfo, null, null, bOptions, false, userId, null, null,
                "startActivityAsUser");
    }

三、startActivityMayWait ,这一步的代码太多了,感兴趣的读者可以自行追踪代码去看,这里用一个流程示意:
①判断是否为显式 - > ②根据Intent查找符合条件的Activity的Activity info - > ③判断是否是重量级进程 - > ④startActivitylocked - > ⑤outResult。

  • 判断intent是否是显式调用,显式调用则Intent中本身带有目标Activity,否则调用resolveActivity()去匹配最合适的Activity
  • 判断目标Activity所属进程是不是重量级,如果当前系统中没有,则要给Intent重新赋值
  • startActivitylocked ,进一步执行
  • 如果outResult不为空,要将函数结果写入这个变量中

四、startActivitylocked ,在ActivityStack.java中有两个这样的重载函数,参数多的我们成为startActivitylocked (1),参数少的称为startActivitylocked (2)

  1. 首先调用(1),确保调用者的进程存活,没有的话直接抛异常
  2. 调用(1)判断在此时有没有合适的Activity来处理Intent,没有的话直接抛异常
  3. 上面的判断通过后,检查调用者是否有权限来启动置顶的Activity,有两个权限必须全部通过
  4. 这时,(1)生成一个ActivityRecord变量r,记录当前各项判断结果,

五、startActivityUnCheckedLocked,这个函数主要是取出目标Activity的启动模式和各种标识符,比如:是标准模式还是singleTop、singleTask、等等都是在这一步去管理

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Android 中,AMS(Activity Manager Service)负责管理 Activity 的生命周期。Activity 有四个状态:运行状态、暂停状态、停止状态和销毁状态。当一个 Activity 运行时,它可以被用户看到,并响应用户的交互;当它被暂停时,它被部分遮挡,但仍然在屏幕上存在;当它被停止时,它被完全遮挡,但其状态仍然保留在内存中;当它被销毁时,它被完全删除,其状态也从内存中释放。 Activity 生命周期管理的关键是回调方法。Android 系统提供了一组回调方法,使得开发者可以在 Activity 的不同状态下执行相应的操作。 以下是 Activity 生命周期的回调方法: 1. onCreate(): Activity 被创建时调用,通常用来完成界面的初始化和数据的加载。 2. onStart(): Activity 变为可见时调用,此时 Activity 进入运行状态。 3. onResume(): Activity 处于前台并处于运行状态时调用,此时 Activity 可以响应用户的交互。 4. onPause(): 当其他 Activity 显示在前台并且当前 Activity 处于可见状态时调用,此时 Activity 进入暂停状态。 5. onStop(): Activity 完全被遮挡时调用,此时 Activity 进入停止状态。 6. onRestart(): 当 Activity 从停止状态重新进入运行状态时调用。 7. onDestroy(): Activity 被销毁时调用,通常用来释放内存或资源。 开发者应根据自己的应用需求在这些回调方法中编写相应的业务逻辑,从而实现自己的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值