ActivityManagerService是如何启动app
ActivityManagerService是如何启动app
一. 上一篇文章app的启动过程,说明了launcher启动app是通过binber,让ActivityManagerService的startactivity来启动app的。
二. 代码不再详细贴出,只给出重要的代码
跟踪到ActivityManagerService的startactivity,执行了startActivityAsUser方法,----》
ActivityStackSupervisor的startActivityMayWait方法,这里保存了appInfo,然后调用startActivityLocked进一步操作把Launcher应用程序的进程信息保存在callerApp变量中,把Launcher的activity信息保存在sourceRecord变量中.调用startActivityUncheckedLocked。
分析一下startActivityUncheckedLocked这个方法
这是方法名字和参数。
这里实现了,启动activity的四种启动模式,
需要启动app就是创建一个新的task来启动这个activity。
这里判定栈顶是不是要启动的activity。
备注:mHomeStack : 只记录存放Launcher和SystemUI(最近应用)的Task,mFocusedStack : 记录所有非Launcher App的Task。mStacks : 这个ArrayList只存放 mHomeStack和 mFocusedStack, mHomeStack 放在第0个位置
这些准备工作完成后,最后就进入startActivityLocked(r, newTask, doResume)进一步处理了,这不影响activity的启动,再调用resumeTopActivityLocked. 它首先看要启动的Activity是否就是当前处理Resumed状态的Activity,如果是的话,那就什么都不用做,直接返回就可以了;否则再看一 下系统当前是否休眠状态,如果是的话,再看看要启动的Activity是否就是当前处于堆栈顶端的Activity,如果是的话,也是什么都不用做。把当处于Resumed状态的Activity推入Paused状态,然后才可以启动新的Activity。但是在将当前这个Resumed状态的 Activity推入Paused状态之前,首先要看一下当前是否有Activity正在进入Pausing状态,如果有的话,当前这个Resumed状 态的Activity就要稍后才能进入Paused状态了,这样就保证了所有需要进入Paused状态的Activity串行处理.
这里的schedulePauseActivity通知Launcher进入Paused状态。prev.app.thread是一个ApplicationThread对象的远程接口,通过调用这个远程接口的schedulePauseActivity来通知Launcher进入Paused状态。
ApplicationThreadProxy.schedulePauseActivity这个函数。就是Binder进程间通信机制
接下来进入到ApplicationThread.schedulePauseActivity。
ActivityManagerService就分析到这里。