Activity
管理
Activity
是最复杂的一个组件,它负责UI
的显示以及处理各类输入事件。Activity
提供窗口供应用在其中绘制界面,同时也提供了各类各样的控件方便开发。Activity 官网传送门前端
另外,
Android
中并无对外提供启动进程的接口,只是在启动Activity
或Service
时,由系统根据须要来启动进程。java
Activity
的生命周期关于Activity
的生命周期,咱们先看下官方图示:
android
Activity
的生命周期图中隐含了Activity
运行时的三种状态,分别是:浏览器
Activity
位于屏幕的最前端,能够接受用户输入的状态Activity
被一个透明或半透明的Activity
覆盖,此时Activity
虽然不能接收用户的输入,但仍是可见的Activity
彻底被另外一Activity
覆盖,不能接受用户输入也不可见时当一个Activity
对象的状态发生变化时,会调用上图中定义的抽象接口来通知应用。相关描述以下:markdown
onCreate()
:当Activity
对象被建立时调用onStart()
:当Activity
在Framework
中的数据结构准备完毕后调用onResume()
:当Activity
来到栈的最前端变成激活态时调用onPause()
:当Activity
从栈的最前端切换到后台时,进入暂停态,并调用该方法onStop()
:当Activity
已经彻底不可见时调用onDestroy()
:在销毁Activity
前,系统会先调用该方法上面的知识在初学Android
时咱们就已经知道了,接下来咱们要从AMS
的角度看下这几个方法是如何调用的,不过在此以前咱们先熟悉下另外的几个相关知识:Intent
、Task
与LaunchMode
网络
Intent
、Task
与LaunchMode
Intent
Intent
是所请求执行动做的抽象描述,一般做为参数来使用,用于完成各个组件之间的消息传递。更为详细的姿式能够参考官网描述:官网传送门数据结构
Intent
类的相关定义以下:app
public class Intent implements Parcelable, Cloneable {
private String mAction;
private Uri mData;
private String mType;
private String mPackage;
private ComponentName mComponent;
private int mFlags;
private ArraySet<String> mCategories;
private Bundle mExtras;
private Rect mSourceBounds;
private Intent mSelector;
private ClipData mClipData;
}
复制代码
经常使用字段含义以下:ide
mAction
是一个字符串,用来指明要执行的操做是什么。
Intent
类中定义了大量的Action
,例如ACTION_VIEW
、ACTION_SEND
等。Action
的做用与具体的功能模块相关,表达要执行的意图mData
储存须要传递的数据,类型是URI
。
URI
是统一资源标识符(Uniform Resources Identifier
)的简称Web
中的各类资源,如HTML文档、图片、文件等URL(Uniform Resource Locator)
是URI
的一种mType
是MIME
格式的字符串,表示数据类型。
MIME
是多功能Internet
邮件扩充服务(Multipurpose Internet Mail Extensions
)的缩写text/plain``application/x-gzip
等Intent
的匹配速度mComponent
用于指定接收Intent
的目标组件的名称
mComponent
的类型是ComponentName
,它包含两个字符串:mPackage
和mClass
,前者用于指定包名,后者用于指定类名Intent
中若是定义了mComponent
,该Intent
将直接发送到指定的组件,不会在经过其余属性组合查找mFlags
称为标志,在Intent
类中定义了不少flag
的相关常量。主要分为两种
FLAG_ACTIVITY_...
开头的,用来控制Activity
启动的相关参数,如FLAG_ACTIVITY_NEW_TASK
FLAG_RECEIVER_...
开头的,用来进行广播的参数mCategories
一个包含应处理Intent
组件类型的附加信息的字符串。常见的类别有两种:
CATEGORY_BROWSABLE
:目标Activity
容许自己经过网络浏览器启动,以显示连接引用的数据CATEGORY_LAUNCHER
:该Activity
是任务的初始Activity
Intent
中,但大多数Intent
均不须要类别mExtras
表示全部附加信息的集合。
mExtras
数据类型是Bundle
putExtra()
方法添加extra数据
,每种方法均接受两个参数:key
和value
Task
Task
是Activity
的集合。Android把用户一次相关操做中使用的Activity
按照前后顺序保存在Task
中,这样当按back键
时就能按照相反的顺序回退。函数
Task
像一个栈,之后进先出的方式管理着Activity
。系统运行时内存中会存在着多个Task
,当咱们按recent
键时,会弹出一个选择列表,这个列表就是系统中存在的Task
的集合,选择一个Task
将把它所包含的Activity
做为一个总体带到前台。Task
中的Activity
的顺序一般是不能改变的,只能经过出栈入栈的方式来增长或移除。
AMS
中使用ActivityStack
来管理Task
,它管理的Task
都存放在成员变量mTaskHistory
中,定义以下:
class ActivityStack{
private final ArrayList<TaskRecord> mTaskHistory = new ArrayList<>();
}
复制代码
mTaskHistory
是一个列表,储存的是TaskRecord
对象。TaskRecord
对象表示一个Task
,它的成员变量mActivities
也是一个列表,储存了该Task
中全部的ActivityRecord
对象。mActivities
的定义以下:
class TaskRecord{
final ArrayList<ActivityRecord> mActivities;
}
复制代码
那么,如何才能开始一个新的Task
呢?
Intent
中定义了一个标志FLAG_ACTIVITY_NEW_TASK
,在startActivity()
的Intent
参数中加入该标志就能开启一个新的Task
affinity
的Task
存在,并不会再启动一个Task
,而是将旧的Task
带到前台那么,affinity
在哪里定义的呢?
affinity
的意思是亲和度,是经过<activity>
标签的android:taskAffinity
属性来定义的FLAG_ACTIVITY_NEW_TASK
启动一个Activity
时,这个Activity
的taskAffinity
属性中的字符串就会成为Task
的affinity
Task
的Activity
,即便它们的taskAffinity
属性定义了一个不一样的字符串,也不会改变Task
已有的affinity
<activity>
标签中没有指定android:taskAffinity
属性,这个Activity
会继承<application>
标签的android:taskAffinity
属性<application>
标签的android:taskAffinity
属性也没有定义,将会使用应用包名做为缺省值
Activity
,即便使用了FLAG_ACTIVITY_NEW_TASK
标志也不必定会启动一个新的Task
Activity
定义了不一样的taskAffinity
属性LaunchMode
Activity
的启动模式隐含的是Activity
对象的复用问题,关于启动模式官网的介绍也很详细:官方传送门
当启动一个Activity
时,若是系统的后台Task
中已经有一个该Activity
的实例存在了,系统是建立一个新的Activity
仍是将已经存在的Activity
切换到前台呢?
答案是都有可能,有多种因素能够影响结果。包括Activity
的属性值以及Intent
中指定的标志
咱们先看下Activity
的属性launchMode
会有哪些影响:
standard
模式:默认。
standard
模式下的Activity
每次启动时都会建立该Activity
的实例对象Task
中能够同时存在该Activity
的多个实例Activity
的多个实例能够出如今多个Task
栈中singleTop
模式
Task
的顶部已存在该Activity
实例,则系统会经过调用该实例的onNewIntent()
方法向其传送Intent
,而非建立新的Activity
实例。standard
模式同样建立新的实例对象singleTask
模式
singleTask
模式的Activity
具备系统惟一性,只能在系统中建立该Activity
的一个实例对象singleTask
模式的Activity
时,若是系统中已经存在该Activity
的实例对象,则将其所在的Task
中排在它前面的Activity
都弹出栈,将该Activity
带到栈顶,并调用其onNewIntent()
方法传递新的Intent
对象Activity
的实例对象,则会建立一个该Activity
的实例对象
Activity
的taskAffinity
属性值和当前Task
的affinity
值相同,它会加入当前的Task
中Activity
的Intent
中没有指定FLAG_ACTIVITY_NEW_TASK
标志,也会启动新的Task
,并将Activity
至于其中singleInstance
模式
singleInstance
模式的Activity一样具备系统惟一性,系统中只有该Activity的一个实例对象Activity
启动到包含该Activity
实例的Task
中Activity
始终是其Task
中的惟一Activity
一般状况下,一个Activity
建立出来后,会停留在某个Task
中,直到它被销毁
Activity
的allowTaskReparenting
属性设置为true
,该Activity
能够在不一样的Task
之间转移Activity
的Intent
中设置了FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
标志时才起做用除了上面介绍的内容,Activity
和Task
的工做逻辑你们能够参考官网:任务和返回堆栈
好比,下面部分提到的技巧就很重要(摘抄自官网):
只有当 Activity 具备 ACTION_MAIN 和 CATEGORY_LAUNCHER 过滤器时,才应使用 "singleTask" 和 "singleInstance" 这两种启动模式,它们会将 Activity 标记为始终启动任务。好比,能够想象一下,若是缺乏该过滤器会发生什么状况:intent 会启动 "singleTask" Activity,随之启动新任务,用户花了一些时间在该任务上。而后,用户按主屏幕按钮。此时,该任务会转到后台,再也不可见。如今,用户没法返回到该任务,由于它未显示在应用启动器中。
ClientTransactionHandler
的做用
ClientTransactionHandler
是在Android 9.0
上出现的,用来串联起AMS
和Activity
的整个生命周期管理的类,很重要
咱们已经知道应用的入口是ActivityThread
类的main()
函数,仔细看下类结构的话会发现要ActivityThread
继承了一个特殊的类。定义以下
public final class ActivityThread extends ClientTransactionHandler {
...
}
复制代码
能够看到ActivityThread
继承了ClientTransactionHandler
类。这个类是在Android 9.0
加入的,关键定义以下:
public abstract class ClientTransactionHandler {
void scheduleTransaction(ClientTransaction transaction) {
transaction.preExecute(this);
sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
}
......
public abstract void handleDestroyActivity(...);
public abstract void handlePauseActivity(...);
public abstract void handleResumeActivity(...);
public abstract void handleStopActivity(...);
......
public abstract Activity handleLaunchActivity(...);
public abstract void handleStartActivity(...);
......
public abstract void handleNewIntent(...);
......
}
复制代码
类中定义了和声明周期有关的方法,机智的咱们能够猜到,AMS
后面生命周期的回调控制应该就是经过它来实现的,相关类继承关系以下:
能够Android
把Activity
相关的生命周期要作的事情抽象了出来,在上面定义的类中,真正业务实现包括:
LaunchActivityItem
就是要执行launch activity
任务resume activity
则是经过ResumeActivityItem
实现pause activity
则是经过PauseActivityItem
实现stop activity
则是经过StopActivityItem
实现destroy activity
则是经过DestoryActivityItem
实现ClientTransaction
的调用逻辑咱们看下整个调用流程: 在ActivityThread
中的ApplicationThread
类有一个scheduleTransaction()
方法,
ApplicationThread
类是一个Binder
服务类,AMS
会做为client
调用这个服务类,固然也就能够调用它的scheduleTransaction()
方法
scheduleTransaction()
方法内容以下:
@Override
public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
ActivityThread.this.scheduleTransaction(transaction);
}
复制代码
调用的是ActivityThread
的scheduleTransaction()
方法,也就是ClientTransactionHandler
类的scheduleTransaction()
方法,方法以下:
void scheduleTransaction(ClientTransaction transaction) {
transaction.preExecute(this);
sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
}
复制代码
发送了一个EXECUTE_TRANSACTION
消息给ActivityThread
的Handler
实现类H
,消息处理以下:
case EXECUTE_TRANSACTION:
final ClientTransaction transaction = (ClientTransaction) msg.obj;
mTransactionExecutor.execute(transaction);
if (isSystem()) {
transaction.recycle();
}
break;
复制代码
消息处理中使用了mTransactionExecutor.execute()
,不出意外,执行逻辑确定在TransactionExecutor
中了,咱们看下:
public void execute(ClientTransaction transaction) {
final IBinder token = transaction.getActivityToken();
executeCallbacks(transaction);
executeLifecycleState(transaction);
mPendingActions.clear();
}
public void executeCallbacks(ClientTransaction transaction) {
final List<ClientTransactionItem> callbacks = transaction.getCallbacks();
if (callbacks == null) {
return;
}
......
final int size = callbacks.size();
for (int i = 0; i < size; ++i) {
......
item.execute(mTransactionHandler, token, mPendingActions);
item.postExecute(mTransactionHandler, token, mPendingActions);
......
}
}
private void executeLifecycleState(ClientTransaction transaction) {
final ActivityLifecycleItem lifecycleItem = transaction.getLifecycleStateRequest();
if (lifecycleItem == null) {
// No lifecycle request, return early.
return;
}
......
// 很重要的一个方法
cycleToPath(r, lifecycleItem.getTargetState(), true /* excludeLastState */);
// Execute the final transition with proper parameters.
lifecycleItem.execute(mTransactionHandler, token, mPendingActions);
lifecycleItem.postExecute(mTransactionHandler, token, mPendingActions);
}
复制代码
能够看到,最后分别在executeCallbacks()
和executeLifecycleState()
两个方中执行了item.execute()
和lifecycleItem.execute()
两个方法
executeCallbacks()
和executeLifecycleState()
目的分别是干什么呢?结合类关系图咱们能够这样推断:
executeCallbacks()
遍历执行的是ClientTransaction
类中List<ClientTransactionItem> mActivityCallbacks
集合中的元素
ClientTransactionItem
类的直接子类实现只有LaunchActivityItem
类executeCallbacks()
主要执行的是launch activity
的通知操做executeLifecycleState()
执行的是ClientTransaction
类中的ActivityLifecycleItem mLifecycleStateRequest
mLifecycleStateRequest
被称为final state
resume activity
、pasue activity
、stop activity
、destory activity
都在这里了解完调用流程会发现,实现类中并无StartActivityItem
,为何呢?那怎么调用onStart()
函数呢?
核心就在cycleToPath()
函数身上
TransactionExecutor.cycleToPath()
针对
Activity
的生命周期,Android
并无定义出全部的*ActivityItem
类,例如StartActivityItem
就并不存在,那么怎么去执行这个start
阶段的函数呢?
请留意类图中ActivityLifecycleItem
有关生命周期的常量定义,Android
在这里经过cycleToPath()
采用了一种比较取巧的操做,核心逻辑就是:
Activity
的final state
Activity
的当前状态去计算过程当中须要的状态,并保存到集合中以文章后面的realStartActivityLocked()
方法为例
LaunchActivityItem
类型的对象添加到callback
中
TransactionExecutor
会先执行LaunchActivityItem
类Activity
进入到ON_CREATE
状态final state
为ResumeActivityItem
TransactionExecutor
经过cycleToPath()
计算当前状态与final state
的差别ON_CREATE
状态,final state
为ON_RESUME
TransactionExecutor
经过帮助类的getLifecyclePath
方法将二者之间缺失的状态整理到集合中performLifecycleSequence()
循环处理performLifecycleSequence()
方法以下:
private void performLifecycleSequence(ActivityClientRecord r, IntArray path) {
final int size = path.size();
for (int i = 0, state; i < size; i++) {
state = path.get(i);
switch (state) {
case ON_CREATE:
mTransactionHandler.handleLaunchActivity(...);
break;
case ON_START:
mTransactionHandler.handleStartActivity(r, mPendingActions);
break;
case ON_RESUME:
mTransactionHandler.handleResumeActivity(...);
break;
case ON_PAUSE:
mTransactionHandler.handlePauseActivity(...);
break;
case ON_STOP:
mTransactionHandler.handleStopActivity(...);
break;
case ON_DESTROY:
mTransactionHandler.handleDestroyActivity(...);
break;
case ON_RESTART:
mTransactionHandler.performRestartActivity(...);
break;
default:
throw new IllegalArgumentException("Unexpected lifecycle state: " + state);
}
}
}
复制代码
PauseActivityItem
的调用分析以PauseActivityItem
类为例,咱们看看具体的执行逻辑:
public class PauseActivityItem extends ActivityLifecycleItem {
......
@Override
public void execute(ClientTransactionHandler client, IBinder token, PendingTransactionActions pendingActions) {
......
client.handlePauseActivity(token, mFinished, mUserLeaving, mConfigChanges, pendingActions,
"PAUSE_ACTIVITY_ITEM");
......
}
}
复制代码
执行的是ClientTransactionHandler
抽象类,其实也就是ActivityThread
类的handlePauseActivity()
方法。
handlePauseActivity()
方法调用了ActivityThread
类的performPauseActivity()
方法,最后调用到的是performPauseActivityIfNeeded()
方法,代码以下:
private void performPauseActivityIfNeeded(ActivityClientRecord r, String reason) {
......
mInstrumentation.callActivityOnPause(r.activity);
......
}
复制代码
执行的是Instrumentation
类的callActivityOnPause()
方法,内容以下:
public void callActivityOnPause(Activity activity) {
activity.performPause();
}
复制代码
很简洁,继续查看:
public class Activity{
final void performPause() {
mDoReportFullyDrawn = false;
mFragments.dispatchPause();
mCalled = false;
onPause();
writeEventLog(LOG_AM_ON_PAUSE_CALLED, "performPause");
mResumed = false;
......
}
}
复制代码
有木有!有木有!onPause();
终于调用到了。。。。。。
咱们已经从应用端找到了调用的流程,可是,对于AMS
来讲它是怎么触发的呢?
接下来,咱们分析下Activity
的启动,在Activity
启动的过程咱们就能够找到AMS
触发声明周期的例子
Activity
研究
Activity
生命周期的调用细节,咱们仍是得从最熟悉的地方入手,也就是经常使用的Activity
对象的startActivity (Intent intent)
方法
Activty.startActivty()
跟踪startActivity (Intent intent)
方法,发现调用关系以下:
class Activity{
public void startActivity(Intent intent, @Nullable Bundle options) {
if (options != null) {
startActivityForResult(intent, -1, options);
} else {
startActivityForResult(intent, -1);
}
}
public void startActivityForResult(...) {
......
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, who,
intent, requestCode, options);
......
}
}
class Instrumentation{
public ActivityResult execStartActivity(...) {
IApplicationThread whoThread = (IApplicationThread) contextThread;
......
try {
intent.migrateExtraStreamToClipData();
intent.prepareToLeaveProcess(who);
int result = ActivityManager.getService()
.startActivity(...);
checkStartActivityResult(result, intent);
} catch (RemoteException e) {
throw new RuntimeException("Failure from system", e);
}
return null;
}
}
class ActivityManagerService{
public final int startActivity(...) {
return startActivityAsUser(...);
}
public final int startActivityAsUser(...) {
......
return mActivityStartController.obtainStarter(intent, "startActivityAsUser")
...
.execute();
}
}
复制代码
咱们看到最后是调用的是AMS
的startActivityAsUser
方法。跟踪startActivityAsUser
方法的调用过程就会发现最后执行的是ActivityStarter
类的execute()
方法来执行Activity
的启动,相关代码以下:
class ActivityStater{
int execute() {
try {
if (mRequest.mayWait) {
return startActivityMayWait(...);
} else {
return startActivity(...);
}
} finally {
onExecutionComplete();
}
}
}
复制代码
咱们看到execute()
有两个启动Activity
的方法,接下来咱们以startActivityMayWait()
方法继续分析,由于最后也会走到startActivity()
中。
ActivityStarter.startActivityMayWait()
简要代码以下:
private int startActivityMayWait(...) {
......
// 获取要启动的 Activity 的信息
ActivityInfo aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags, profilerInfo);
synchronized (mService) {
......
int res = startActivity(caller, ...);
......
if (outResult != null) { // 须要返回结果
outResult.result = res;
final ActivityRecord r = outRecord[0];
switch(res) {
case START_SUCCESS: {
// 添加到特定集合中
mSupervisor.mWaitingActivityLaunched.add(outResult);
do {
try {
// 等待应用进程中的 Activity 启动完成
mService.wait();
} catch (InterruptedException e) {
}
} while (outResult.result != START_TASK_TO_FRONT
&& !outResult.timeout && outResult.who == null);
......
break;
}
......
}
}
return res;
}
}
复制代码
startActivityMayWait()
方法的流程以下:
resolveActivity()
方法来获取要启动的Activity
的信息Activity
的信息后,继续调用startActivity()
方法来继续启动Activity
Activity
的应用须要获取返回结果,则调用mService
对象的wait()
方法挂起线程等待启动的结果接下来就是调用ActivityStarter
的startActivity()
方法的代码,咱们看下部分细节:
private int startActivity(IApplicationThread caller, ...) {
int err = ActivityManager.START_SUCCESS;
......
if (caller != null) {
// 获取启动Activity的进程的信息
callerApp = mService.getRecordForAppLocked(caller);
if (callerApp != null) {
callingPid = callerApp.pid;
callingUid = callerApp.info.uid;
} else {
err = ActivityManager.START_PERMISSION_DENIED;
}
}
final int userId = aInfo != null && aInfo.applicationInfo != null
? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0;
......// 省略不少错误检查
// 检查调用者的相关权限
boolean abort = !mSupervisor.checkStartAnyActivityPermission(...);
// 检查 Intent 防火墙是否屏蔽了该 Intent
abort |= !mService.mIntentFirewall.checkStartActivity(...);
......
if (mService.mController != null) {
try {
// 将 Activity 启动的消息通知监听系统Activity变更的接口 IActivityControler
Intent watchIntent = intent.cloneFilter();
abort |= !mService.mController.activityStarting(watchIntent,
aInfo.applicationInfo.packageName);
} catch (RemoteException e) {
mService.mController = null;
}
}
......
if (abort) {
......// 若是 abort 为true,直接退出
return START_ABORTED;
}
......
// 建立 ActivityRecord 对象
ActivityRecord r = new ActivityRecord(...);
if (outActivity != null) {
outActivity[0] = r;
}
......
// 当前用户正在操做的 ActivityStack
final ActivityStack stack = mSupervisor.mFocusedStack;
// 针对常常切换进程的状况,检查调用者是否有权限进行进程切换
if (voiceSession == null && (stack.getResumedActivity() == null
|| stack.getResumedActivity().info.applicationInfo.uid != realCallingUid)) {
if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid,
realCallingPid, realCallingUid, "Activity start")) {
// 对于不能切换进程的状况,把 Activity 信息放入 mPendingActivityLaunches 列表中
mController.addPendingActivityLaunch(new PendingActivityLaunch(r,
sourceRecord, startFlags, stack, callerApp));
ActivityOptions.abort(checkedOptions);
return ActivityManager.START_SWITCHES_CANCELED;
}
}
if (mService.mDidAppSwitch) {
mService.mAppSwitchesAllowedTime = 0;
} else {
mService.mDidAppSwitch = true;// 打开开关,容许进程间切换
}
// 启动挂起等待的 Activity,其实就是逐个启动 mPendingActivityLaunches 列表中的 Activity。
// 最后也是调用了 startActivity
// 我的理解,大多数状况下 mPendingActivityLaunches 列表应该是空的吧
mController.doPendingActivityLaunches(false);
......
// 调用startActivity另外一个重载方法,第一个参数为 ActivityRecord
return startActivity(r, ...);
}
private int startActivity(final ActivityRecord r, ...) {
int result = START_CANCELED;
......
result = startActivityUnchecked(r, ...);
......
return result;
}
复制代码
这里其实不用记录太多细节,重要的是了解启动Activity
方法的调用流程,这里最后调用的是startActivityUnchecked()
方法,咱们来继续看下。
ActivityStarter.startActivityUnchecked()
方法以下:
private int startActivityUnchecked(final ActivityRecord r, ...) {
// 初始化环境和lunchModeFlags
setInitialState(r, options, inTask, doResume, startFlags, sourceRecord, voiceSession,
voiceInteractor);
computeLaunchingTaskFlags();
computeSourceStack();
mIntent.setFlags(mLaunchFlags);
// 判断 Activity 是否须要插入新的 Task,如下状况 reusedActivity 不为空
// 1.设置了FLAG_ACTIVITY_NEW_TASK:
// 2.启动模式为singleTask:
// 3.启动模式为singleInstance
ActivityRecord reusedActivity = getReusableIntentActivity();
......
final boolean dontStart = top != null && mStartActivity.resultTo == null
&& top.realActivity.equals(mStartActivity.realActivity)
&& top.userId == mStartActivity.userId
&& top.app != null && top.app.thread != null
&& ((mLaunchFlags & FLAG_ACTIVITY_SINGLE_TOP) != 0
|| isLaunchModeOneOf(LAUNCH_SINGLE_TOP, LAUNCH_SINGLE_TASK));
if (dontStart) { // 不须要启动的状况
// For paranoia, make sure we have correctly resumed the top activity.
topStack.mLastPausedActivity = null;
if (mDoResume) {
mSupervisor.resumeFocusedStackTopActivityLocked();
}
......
deliverNewIntent(top);
......
return START_DELIVERED_TO_TOP;
}
boolean newTask = false;
final TaskRecord taskToAffiliate = (mLaunchTaskBehind && mSourceRecord != null)
? mSourceRecord.getTask() : null;
// 判断当前 Activity 是否须要一个新的 Task
int result = START_SUCCESS;
if (mStartActivity.resultTo == null && mInTask == null && !mAddingToTask
&& (mLaunchFlags & FLAG_ACTIVITY_NEW_TASK) != 0) {
newTask = true;
result = setTaskFromReuseOrCreateNewTask(taskToAffiliate, topStack);
} else if (mSourceRecord != null) {
result = setTaskFromSourceRecord();
} else if (mInTask != null) {
result = setTaskFromInTask();
} else {
// This not being started from an existing activity, and not part of a new task...
// just put it in the top task, though these days this case should never happen.
setTaskToCurrentTopOrCreateNewTask();
}
......
// 启动 Activity
// startActivityLocked 这里主要是将 ActivityRecord 对象加入到 Task 的顶部
// 同时将 Task 添加到 mTaskHistory 的顶部
mTargetStack.startActivityLocked(mStartActivity, topFocused, newTask, mKeepCurTransition,
mOptions);
// 利用 WindowManager 使 Activity 可见
if (mDoResume) {
final ActivityRecord topTaskActivity = mStartActivity.getTask().topRunningActivityLocked();
if (!mTargetStack.isFocusable() || (topTaskActivity != null && topTaskActivity.mTaskOverlay && mStartActivity != topTaskActivity)) {
mTargetStack.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
mService.mWindowManager.executeAppTransition(); // 此处应该是执行应用间的切换动画
} else {
.......
mSupervisor.resumeFocusedStackTopActivityLocked(mTargetStack, mStartActivity,
mOptions);
}
} else if (mStartActivity != null) {
mSupervisor.mRecentTasks.add(mStartActivity.getTask());
}
......
return START_SUCCESS;
}
复制代码
startActivityUnchecked()
方法主要是经过Intent
的标志和Activity
的属性来肯定Activity
的Task
,而后将其调整至栈顶,细节咱们先略过,须要重点关注的方法是mSupervisor.resumeFocusedStackTopActivityLocked()
方法的调用。跟踪调用就会发现,最后执行的是ActivityStack
类的resumeTopActivityInnerLocked()
方法
ActivityStack.resumeTopActivityInnerLocked()
咱们前面已经知道
resumeFocusedStackTopActivityLocked()
方法最终会调用ActivityStack
类的resumeTopActivityInnerLocked()
方法。
resumeTopActivityInnerLocked()
方法主要的做用是将位于栈顶的Activity
显示出来,不过在此以前,旧的Activity
(变量mResumedActivity
引用的就是)还显示在屏幕上。方法内容以下:
private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {
if (!mService.mBooting && !mService.mBooted) {
// Not ready yet!
return false;
}
// 从要 mTaskHistory 中查找要启动的 Activity
// 这里这样作应该是由于前面已经将 Activity 放入堆栈中了
final ActivityRecord next = topRunningActivityLocked(true /* focusableOnly */);
final boolean hasRunningActivity = next != null;
......
if (!hasRunningActivity) {
// There are no activities left in the stack, let's look somewhere else.
return resumeTopActivityInNextFocusableStack(prev, options, "noMoreActivities");
}
next.delayedResume = false;
// 若是当前显示的 Activity 就是要启动的 Activity,直接返回
if (mResumedActivity == next && next.isState(RESUMED)
&& mStackSupervisor.allResumedActivitiesComplete()) {
executeAppTransition(options);
return false;
}
// 若是正在休眠或者关机,直接返回
if (shouldSleepOrShutDownActivities()
&& mLastPausedActivity == next
&& mStackSupervisor.allPausedActivitiesComplete()) {
executeAppTransition(options);
return false;
}
// user 状态检查
if (!mService.mUserController.hasStartedUserState(next.userId)) {
return false;
}
// 将要启动的 Activity 从相关队列中移除
mStackSupervisor.mStoppingActivities.remove(next);
mStackSupervisor.mGoingToSleepActivities.remove(next);
next.sleeping = false;
mStackSupervisor.mActivitiesWaitingForVisibleActivity.remove(next);
// 检查是否有正在 Pause 的 Activity
if (!mStackSupervisor.allPausedActivitiesComplete()) {
return false;
}
// 设置要启动的 applicationInfo
mStackSupervisor.setLaunchSource(next.info.applicationInfo.uid);
......
boolean pausing = mStackSupervisor.pauseBackStacks(userLeaving, next, false);
if (mResumedActivity != null) {
// 暂停当前 Activity
// startPausingLocked() 中便会触发 旧Activity 的 onPause() 操做
pausing |= startPausingLocked(userLeaving, false, next, false);
}
......
ActivityStack lastStack = mStackSupervisor.getLastStack();
if (next.app != null && next.app.thread != null) {
// 若是 Activity 所在的应用已经存在,只须要把 Activity 显示出来
......
synchronized(mWindowManager.getWindowManagerLock()) {
// This activity is now becoming visible.
if (!next.visible || next.stopped || lastActivityTranslucent) {
next.setVisibility(true);
}
......
try {
final ClientTransaction transaction = ClientTransaction.obtain(next.app.thread,
next.appToken);
......
// 若是当前 Activity 还有等待返回的结果,添加 ActivityResultItem,
// 其中会执行 onActivityResult 回调
ArrayList<ResultInfo> a = next.results;
if (a != null) {
final int N = a.size();
if (!next.finishing && N > 0) {
if (DEBUG_RESULTS) Slog.v(TAG_RESULTS,
"Delivering results to " + next + ": " + a);
transaction.addCallback(ActivityResultItem.obtain(a));
}
}
// 添加 NewIntentItem,其中会执行 onNewIntent
if (next.newIntents != null) {
transaction.addCallback(NewIntentItem.obtain(next.newIntents,
false /* andPause */));
}
transaction.setLifecycleStateRequest(
ResumeActivityItem.obtain(next.app.repProcState,
mService.isNextTransitionForward()));
mService.getLifecycleManager().scheduleTransaction(transaction);
......
} catch (Exception e) {
// Whoops, need to restart this activity!
......
mStackSupervisor.startSpecificActivityLocked(next, true, false);
if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked();
return true;
}
}
......
} else {
// Whoops, need to restart this activity!
......
mStackSupervisor.startSpecificActivityLocked(next, true, true);
}
......
return true;
}
复制代码
resumeTopActivityInnerLocked()
代码比较长做了精简,核心逻辑以下:
startPausingLocked()
暂停旧的Activity
,startPausingLocked()
方法以下: final boolean startPausingLocked(boolean userLeaving, boolean uiSleeping, ActivityRecord resuming, boolean pauseImmediately) {
......
mService.getLifecycleManager().scheduleTransaction(prev.app.thread, prev.appToken,
PauseActivityItem.obtain(prev.finishing, userLeaving,
prev.configChangeFlags, pauseImmediately));
......
}
复制代码
ClientTransaction
呼应上了,嘿嘿Activity
所在的应用已经启动,对Activity
进行显示处理,建立ResumeActivityItem
进行生命周期通知
Activity
对象的onResume()
方法的执行startSpecificActivityLocked()
方法继续处理,方法以下: void startSpecificActivityLocked(ActivityRecord r, boolean andResume, boolean checkConfig) {
// 获取 Activity 对应的进程
ProcessRecord app = mService.getProcessRecordLocked(r.processName,
r.info.applicationInfo.uid, true);
if (app != null && app.thread != null) {
try {
......
// 若是应用进程已经存在的状况,执行 realStartActivityLocked()
// andResume = true
realStartActivityLocked(r, app, andResume, checkConfig);
// 而后返回
return;
} catch (RemoteException e) {
}
}
// Activity 对应的进程为空,经过 AMS 的 startProcessLocked() 建立新的进程
mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
"activity", r.intent.getComponent(), false, false, true);
}
复制代码
realStartActivityLocked()
,就算是从新启动进程的状况,最后执行的也是realStartActivityLocked()
ActivityStackSupervisor.realStartActivityLocked()
对于realStartActivityLocked()
方法,咱们简单看下和生命周期相关的内容:
final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app, boolean andResume, boolean checkConfig) throws RemoteException {
......
// Create activity launch transaction.
final ClientTransaction clientTransaction = ClientTransaction.obtain(app.thread,
r.appToken);
// 添加 LaunchActivityItem,这个会触发 onCreate 方法
clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent), ...);
// 设置最终状态,resume 仍是 pause
final ActivityLifecycleItem lifecycleItem;
// 根据前面的调用参数能够肯定,andResume = true
if (andResume) {
// 设置最终状态为 ON_RESUME
lifecycleItem = ResumeActivityItem.obtain(mService.isNextTransitionForward());
} else {
lifecycleItem = PauseActivityItem.obtain();
}
clientTransaction.setLifecycleStateRequest(lifecycleItem);
// Schedule transaction.
mService.getLifecycleManager().scheduleTransaction(clientTransaction);
......
return true;
}
复制代码
方法中添加了LaunchActivityItem
和ResumeActivityItem
类的对象,并调用了scheduleTransaction()
方法。
LaunchActivityItem
属于比较复杂的调用逻辑
以LaunchActivityItem
类为例,咱们来看跟踪下调用关系:
public class LaunchActivityItem extends ClientTransactionItem {
@Override
public void execute(ClientTransactionHandler client, IBinder token, PendingTransactionActions pendingActions) {
......
client.handleLaunchActivity(r, pendingActions, null /* customIntent */);
......
}
}
复制代码
调用的是ActivityThread
中handleLaunchActivity()
的方法:
public Activity handleLaunchActivity(ActivityClientRecord r, PendingTransactionActions pendingActions, Intent customIntent) {
......
final Activity a = performLaunchActivity(r, customIntent);
......
return a;
}
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
......
Activity activity = null;
try {
java.lang.ClassLoader cl = appContext.getClassLoader();
activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);
......
} catch (Exception e) {
...
}
try {
......
if (activity != null) {
......
activity.mCalled = false;
if (r.isPersistable()) {
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
} else {
mInstrumentation.callActivityOnCreate(activity, r.state);
}
if (!activity.mCalled) {
throw new SuperNotCalledException(
"Activity " + r.intent.getComponent().toShortString() +
" did not call through to super.onCreate()");
}
r.activity = activity;
}
// 将状态设置为 ON_CREATE
r.setState(ON_CREATE);
} catch (SuperNotCalledException e) {
throw e;
} catch (Exception e) {
......
}
return activity;
}
复制代码
调用的是Instrumentation.callActivityOnCreate()
方法,内容以下:
public void callActivityOnCreate(Activity activity, Bundle icicle) {
prePerformCreate(activity);
activity.performCreate(icicle);
postPerformCreate(activity);
}
复制代码
最后经过是调用的Activity.performCreate()
方法:
final void performCreate(Bundle icicle, PersistableBundle persistentState) {
......
if (persistentState != null) {
onCreate(icicle, persistentState);
} else {
onCreate(icicle);
}
......
}
复制代码
到这里,LaunchActivityItem
的逻辑就结束了,也执行完了onCreate()
回调,状态设置为了ON_CREATE
。
可是因为realStartActivityLocked()
中设置的最终状态为ON_RESUME
,当前Activity
的状态不是最终状态,因此TransactionExecutor
还会继续执行。