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就分析到这里。

posted @ 2016-02-04 18:09  大暴雨  阅读(880)  评论(0编辑  收藏  举报