从framework源码理解Activity原理.

从framework源码理解Activity原理... 2

1.       相关类功能介绍及关联关系... 2

1.1.       Instrumentation. 2

1.1.1.        功能介绍... 2

1.1.2.        主要方法... 2

1.2.       ActivityThread. 2

1.2.1.        主要方法... 2

1.3.       ApplicationThread. 2

1.3.1.        描述... 2

1.4.       ActivityStackSupervisor. 2

1.4.1.        描述... 2

1.4.2.        创建... 2

1.4.3.        主要方法... 2

1.5.       ActivityRecord. 3

1.5.1.        描述... 3

1.5.2.        主要信息... 3

1.5.3.        创建... 3

1.6.       TaskRecord. 3

1.6.1.        主要信息... 3

1.6.2.        创建... 4

1.7.       ActivityStack. 4

1.7.1.        ActivityStack的种类... 4

1.7.2.        创建... 5

1.8.       ProcessRecord. 5

2.       主要流程... 5

2.1.       Activity启动流程... 5

2.2.       与进程启动的关系... 5

http://gityuan.com/2016/10/09/app-process-create-2/. 5

2.3.       AMS启动流程... 5

2.4.       栈管理... 5

3.       问题... 5

从framework源码理解Activity原理

1.     相关类功能介绍及关联关系

1.1.     Instrumentation

1.1.1.     功能介绍

进程的总管家,每个Activity内部都有一个该Instrumentation对象的引用。接收来自Activity/ ActivityThread的命令,然后单项调用AMS;统计、测量应用程序所有开销。

1.1.2.     主要方法

1.2.     ActivityThread

应用对应的进程的主线程类,即UI线程。

1.2.1.     主要方法

main-应用程序的入口

1.3.     ApplicationThread

1.3.1.     描述

ActivityThread的内部类,一个Binder类,即可实现跨进程通信。主要用于接受从AMS传递过来的消息,继而做相应处理。

1.4.     ActivityStackSupervisor

1.4.1.     描述

Activity的栈管理器,管理着两个重要的Activity栈。

mHomeStack管理的是Launcher相关的任务,包括Launcher、RecentTask,Keyguad

mFocusedStack管理普通任务。

1.4.2.     创建

在ActivityManagerService的构造函数内创建的

1.4.3.     主要方法

1.4.3.1. dismissKeyguard()

1.4.3.2. resumeHomeActivity(ActivityRecordprev)

1.5.     ActivityRecord

1.5.1.     描述

每一个ActivityRecord都会有一个Activity与之对应,一个Activity可能会有多个ActivityRecord,因为Activity可以被多次实例化,取决于其launchmode。

ActivityRecord包含了一个Activity的所有信息。

1.5.2.     主要信息

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;

1.5.3.     创建

ActivityRecord是在startActivity时创建的

1.6.     TaskRecord

1.6.1.     主要信息

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;

1.6.2.     创建

ActivityRecord是在startActivity时创建的

当没有可复用的TaskRecord时(假如第一次跑进来,肯定是没有的,必须要创建),就会创建一个TaskRecord,mStartActivity是要启动的Activity的ActivityRecord,通过其setTask就把ActivityRecord绑定到了一个TaskRecord上。

1.7.     ActivityStack

ActivityStack管理了一系列的TaskRecord,通过mStackId来唯一标识,持有ActivityStackSupervisor的引用。

1.7.1.     ActivityStack的种类

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;

                                ...

}

1.7.2.     创建

ActivityStack并不是开机就创建的,而是在需要时才创建。

关系:

一个ActivityStack可以包含很多个TaskRecord,一个TaskRecord又可以包含很多个ActivityRecord。

https://blog.csdn.net/kebelzc24/article/details/53747506

1.8.     ProcessRecord

https://blog.csdn.net/tonyandroid1984/article/details/70224827?locationNum=11&fps=1

2.     主要流程

1.     主要流程

1.1.     跨进程Activity启动流程

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.2.     进程内Activity启动流程

1.3.     AMS启动流程

1.4.     栈管理

ActivityManagerService-->ActivityStack->TaskRecord->ActivityRecord




猜你喜欢

转载自blog.csdn.net/weixin_41671640/article/details/80858916