1.4. ActivityStackSupervisor. 2
http://gityuan.com/2016/10/09/app-process-create-2/. 5
从framework源码理解Activity原理
进程的总管家,每个Activity内部都有一个该Instrumentation对象的引用。接收来自Activity/ ActivityThread的命令,然后单项调用AMS;统计、测量应用程序所有开销。
应用对应的进程的主线程类,即UI线程。
main-应用程序的入口
ActivityThread的内部类,一个Binder类,即可实现跨进程通信。主要用于接受从AMS传递过来的消息,继而做相应处理。
Activity的栈管理器,管理着两个重要的Activity栈。
mHomeStack管理的是Launcher相关的任务,包括Launcher、RecentTask,Keyguad
mFocusedStack管理普通任务。
在ActivityManagerService的构造函数内创建的
1.4.3.1. dismissKeyguard()
1.4.3.2. resumeHomeActivity(ActivityRecordprev)
每一个ActivityRecord都会有一个Activity与之对应,一个Activity可能会有多个ActivityRecord,因为Activity可以被多次实例化,取决于其launchmode。
ActivityRecord包含了一个Activity的所有信息。
frameworks/base/services/core/java/com/android/server/am/ActivityRecord.java
//ams的引用
final ActivityManagerService service; //owner
//token用来和wms交互
final IApplicationToken.Stub appToken; //window manager token
final ActivityInfo info; // all about me
final ApplicationInfo appInfo; //information about activity's app
...
//Activity资源信息
CharSequence nonLocalizedLabel; // the label information from the packagemgr.
int labelRes; // the label information from thepackage mgr.
int icon; // resource identifier ofactivity's icon.
int logo; // resource identifier ofactivity's logo.
int theme; // resource identifier ofactivity's theme.
int realTheme; // actual theme resource we will use,never 0.
int windowFlags; // custom window flags for previewwindow.
//ActivityRecord所在的TaskRecord
TaskRecord task; // the task this is in.
...
//ActivityRecord所在进程
ProcessRecord app; // ifnon-null, hosting application
还定义了activity的类型,一共有三种
static final int APPLICATION_ACTIVITY_TYPE = 0;
static final intHOME_ACTIVITY_TYPE = 1;
static final intRECENTS_ACTIVITY_TYPE = 2;
ActivityRecord是在startActivity时创建的
frameworks/base/services/core/java/com/android/server/am/TaskRecord.java
//TaskRecord的唯一标识
final int taskId; // Unique identifier for this task.
...
// This represents the last resolvedactivity values for this task
// NOTE: This value needs to be persistedwith each task
TaskDescription lastTaskDescription = newTaskDescription();
//TaskRecord里所有的ActivityRecord信息
/** List of all activities in the taskarranged in history order */
final ArrayList<ActivityRecord>mActivities;
//TaskRecord所在的stack
/** Current stack */
ActivityStack stack;
ActivityRecord是在startActivity时创建的
当没有可复用的TaskRecord时(假如第一次跑进来,肯定是没有的,必须要创建),就会创建一个TaskRecord,mStartActivity是要启动的Activity的ActivityRecord,通过其setTask就把ActivityRecord绑定到了一个TaskRecord上。
ActivityStack管理了一系列的TaskRecord,通过mStackId来唯一标识,持有ActivityStackSupervisor的引用。
frameworks/base/core/java/android/app/ActivityManager.java
public static classStackId {
/** Invalid stack ID. */
public static final intINVALID_STACK_ID = -1;
/** First static stack ID. */
public static final intFIRST_STATIC_STACK_ID = 0;
/** Home activity stack ID. */
//launcheractivity和recentactivity所在的TaskRecord
public static final int HOME_STACK_ID =FIRST_STATIC_STACK_ID;
/** ID of stack where fullscreenactivities are normally launched into. */
public static final intFULLSCREEN_WORKSPACE_STACK_ID = 1;
/** ID of stack where freeform/resizedactivities are normally launched into. */
public static final intFREEFORM_WORKSPACE_STACK_ID = FULLSCREEN_WORKSPACE_STACK_ID + 1;
/** ID of stack that occupies adedicated region of the screen.分屏模式 */
public static final int DOCKED_STACK_ID= FREEFORM_WORKSPACE_STACK_ID + 1;
/** ID of stack that always on top(always visible) when it exist. 画中画模式*/
public static final int PINNED_STACK_ID= DOCKED_STACK_ID + 1;
/** Last static stack stack ID. */
public static final intLAST_STATIC_STACK_ID = PINNED_STACK_ID;
...
}
ActivityStack并不是开机就创建的,而是在需要时才创建。
关系:
一个ActivityStack可以包含很多个TaskRecord,一个TaskRecord又可以包含很多个ActivityRecord。
https://blog.csdn.net/kebelzc24/article/details/53747506
https://blog.csdn.net/tonyandroid1984/article/details/70224827?locationNum=11&fps=1
1.1.1. 概述
一. Step1 - Step 11:Launcher通过Binder进程间通信机制通知ActivityManagerService,它要启动一个Activity;
二. Step 12 - Step 16:ActivityManagerService通过Binder进程间通信机制通知Launcher进入Paused状态;
三. Step 17 - Step 24:Launcher通过Binder进程间通信机制通知ActivityManagerService,它已经准备就绪进入Paused状态,于是ActivityManagerService就创建一个新的进程,用来启动一个ActivityThread实例,即将要启动的Activity就是在这个ActivityThread实例中运行;
四. Step 25 - Step 27:ActivityThread通过Binder进程间通信机制将一个ApplicationThread类型的Binder对象传递给ActivityManagerService,以便以后ActivityManagerService能够通过这个Binder对象和它进行通信;
五. Step 28 - Step 35:ActivityManagerService通过Binder进程间通信机制通知ActivityThread,现在一切准备就绪,它可以真正执行Activity的启动操作了。
1.1.2. AMS启动Activity时与应用进程的交互关系
1.1.3. 流程图
Activity-
Ø 在Launch发送startActivity请求
ü Activity.startActivity
ü Activity.startActivityForResult
ü Instrumentation.execStartActivity
Ø AMS接收客户端startActivity请求
ü ActivityManagerProxy.startActivity
ü ActivityManagerService.startActivity
ü ActivityManagerService.startActivityAsUser
ü ActivityStackSupervisor.startActivityMayWait
ü ActivityStackSupervisor.startActivityLocked
1.1.3.1. ActivityStackSupervisor .startActivityLocked
对Activity做信息解析及检查,然后创建ActivityRecord;
如果进程没有创建,首先创建进程
如果进程已经创建,
1.1.4. 启动栈管理
1.1.5. 与生命周期的关系
首先暂停前一个Activity,通过ApplicationThread.schedulePauseActivity跨进程调用,发送pause消息到主线程处理(H.handleMessage);
--ActivityThread.handlePauseActivity
Activity处理生命周期状态,调用onPause回调,然后通知AMS暂停完成;
然后AMS根据返回的暂停消息,处理暂停完成;ActivityStack.activityPaused--ActivityStack.completePauseLocked
接下来启动要启动的Activity对应的进程,在ActivityStack.resumeTopActivityLokced中,调用ActivityManagerService.startProcessLocked
通过Process.start会反射调用ActivityThread的main函数。
创建一个ActivityThread实例,然后调用它的attach函数,接着就进入消息循环了,直到最后进程退出。
attach会调用AmsattachApplication
此处创建ProcessRecord,d对app进行初始化,并调用realStartActivityLocked启动Activity
启动Acitivity: 此处AMS会调用客户端进程进行Activity启动处理,先用classLoader加载Activity,然后创建Application对象,再然后进入Activity的生命周期)。
http://gityuan.com/2016/10/09/app-process-create-2/
1.3. AMS启动流程
ActivityManagerService-->ActivityStack->TaskRecord->ActivityRecord