概述
Activity的启动方式有两种,一种是显式的,一种是隐式的。
而且,启动的 Activity
和原 Activity
的进程关系的不同又可以分为两种情况,一种是在同一个进程,另外一种情况是开启一个新的进程来启动 Activity
。
相关类介绍
涉及到的类:
1 | frameworks/base/core/java/android/app/Activity.java |
- ActivityThread:代表了应用的主线程,在Activity.attach()方法中初始化
- TaskRecord:Activity的管理者
- ActivityStack:Stack的管理者
- ActivityStackSupervisor:ActivityStack的管理者,早期的Android版本是没有这个类的,直到Android 6.0才出现。
启动流程图
进程间的通信
启动流程
启动前期,当前进程
1 | public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) { |
这里注意到 mParent
变量,一般情况下这里 mParent
是为空的,除非是启动 ActivityGroup
等可以嵌套 Activity
的内部的 Activity
时才会不为空。
Instrumentation.execStartActivity
1 | public ActivityResult execStartActivity( |
mActivityMonitors
是 ActivityMonitor
的一个集合,该类用来监控应用中的单个活动,可监控一些指定的意图。一般在一些测试Case时使用。创建 ActivityMonitor
实例后,通过调用 ActivityInstrumentationTestCase2
的 getInstrumentation()
方法获取 Instrumentation
实例,然后通过 addMonitor
方法添加这个实例,当目标活动启动后,系统会匹配 Instrumentation
中的 ActivityMonitor
实例列表,如果匹配,就会累加计数器。
ActivityManagerService的处理
ActivityManagerService.startActivityAsUser
1 |
|
从这里开始就在AMS进程中执行了,下面简单介绍一下这些参数代表的意义:
- resultTo: 指调用者Activity的mToken,mToken对象保存它所处的ActivityRecord信息
ActivityStackSupervisor.startActivityMayWait()
1 | final int startActivityMayWait(IApplicationThread caller, int callingUid, |
ActivityStackSupervisor.startActivityLocked()
1 | final int startActivityLocked(IApplicationThread caller, |
ActivityStackSupervisor.startActivityUncheckedLocked()
参数中 r 代表即将要启动的 Activity
对应的 ActivityRecord
,sourceRecord
代表调用者。
1 | final int startActivityUncheckedLocked(final ActivityRecord r, ActivityRecord sourceRecord, |
目标activity不存在的情况:
1 | // 接下来处理目标activity不存在的情况 |
可以看到这个方法首先是修正了一些启动参数,接着根据目标Activity是否存在分别进行了处理,然后启动activity。
ActivityStack.startActivityLocked()
1 | final void startActivityLocked(ActivityRecord r, boolean newTask, |
ActivityStackSupervisor.resumeTopActivitiesLocked()
1 | boolean resumeTopActivitiesLocked(ActivityStack targetStack, ActivityRecord target, |
ActivityStack.resumeTopActivityLocked()
1 | final boolean resumeTopActivityLocked(ActivityRecord prev, Bundle options) { |
ActivityStack.resumeTopActivityInnerLocked()
这里的参数 prev
表示待启动的 ActivityRecord
。
1 | private boolean resumeTopActivityInnerLocked(ActivityRecord prev, Bundle options) { |
接下来就开始进行一些activity的切换工作,首先要pause当前activity,将待显示的activity进行resume。
1 | // 设置WakeLock,保证在启动过程中系统不会休眠 |
此方法中把待启动activity推到栈顶,并把activity的状态置为resume状态。
ActivityStackSupervisor.startSpecificActivityLocked()
1 | void startSpecificActivityLocked(ActivityRecord r, |
AMS中启动新进程
ActivityManagerService.startProcessLocked()
这里先介绍一些什么是bad进程:如果一个进程在一分钟内crash两次,那么就会被认为是bad进程而被添加到mBadProcesses
列表,BadProcessInfo
里面保存了添加的时间。如果如果用户重新启动进程,那么就把该进程重列表中删除,直到下次crash时。
1 | final ProcessRecord startProcessLocked(String processName, ApplicationInfo info, |
ActivityManagerService.newProcessRecordLocked()
创建新的ProcessRecord对象
1 | final ProcessRecord newProcessRecordLocked(ApplicationInfo info, String customProcess, |
ActivityManagerService.startProcessLocked()
1 | private final void startProcessLocked(ProcessRecord app, String hostingType, |
新进程
Process.start()
通过socket通信告知Zygote创建fork子进程,创建新进程后将 ActivityThread
类加载到新进程,并调用 ActivityThread.main()
方法。
ActivityThread.main()
1 | public static void main(String[] args) { |
ActivityThread.attach()
1 | private void attach(boolean system) { |
接下来又会转到 ActivityManagerService
进程去执行。
ActivityManagerService.attachApplication()
1 |
|
ActivityManagerService.attachApplicationLocked()
1 | private final boolean attachApplicationLocked(IApplicationThread thread, |
ActivityThread.handleBindApplication()
这里又转到应用进程来处理进程绑定的工作。
1 | private void handleBindApplication(AppBindData data) { |
ActivityStackSupervisor.attachApplicationLocked()
接下来会继续处理 ActivityManagerService.attachApplication()
中的 ActivityStackSupervisor.attachApplicationLocked()
方法。将 ActivityStackSupervisor
绑定到应用进程。
1 | boolean attachApplicationLocked(ProcessRecord app) throws RemoteException { |
ActivityStackSupervisor.realStartActivityLocked()
开始执行真正的Activity启动操作,从这里开始的流程就和进程已经存在时启动activity流程一样的了。
1 | final boolean realStartActivityLocked(ActivityRecord r, |
ActivityThread.H.handleMessage():LAUNCH_ACTIVITY
跳转到应用进程来处理,从这里开始就开始Activity的生命周期的运转了。
1 | public void handleMessage(Message msg) { |
ActivityThread.handleLaunchActivity()
1 | private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) { |
ActivityThread.performLaunchActivity()
1 | private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) { |
从 performLaunchActivity
方法开始,正式进入了 Activity
的 onCreate()
、onStart()
、onResume()
等生命周期过程。
至此,Activity
的启动流程基本介绍完了。