- 概述
- (1) APP端-Launcher
- (2) system端
- (3) APP端-Launcher
- (4) system端
- (5) APP端-ActivityDemo
- (6)system&Home-onStop()
概述
常见场景
创建Activity对象,常见场景如下:
- 桌面点击方式启动一个APP,该APP进程启动之后,再启动自己的根Activity;
- 进程已存在,调用startActivity(intent)开启一个未实例化的或者允许多个实例存在的Activity;
- 其它方式。
日志-桌面点击
Base on: Android 13
场景:在桌面启动APP名为ActivityDemo的APP,被启动的Activity为com.demoapp.activitydemo.MainActivity。
涉及到的进程:Home、system_server及ActivityDemo。
06-12 18:43:38.985 1711 13415 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.demoapp.activitydemo/.MainActivity bnds=[23,530][230,894]} from uid 10086
# system端
06-12 18:43:38.995 1711 13415 I wm_task_created: [51,-1]
06-12 18:43:39.006 1711 13415 I wm_task_moved: [51,1,6]
06-12 18:43:39.007 1711 13415 I wm_task_to_front: [0,51]
06-12 18:43:39.008 1711 13415 I wm_create_task: [0,51]
06-12 18:43:39.008 1711 13415 I wm_create_activity: [0,245284976,51,com.demoapp.activitydemo/.MainActivity,android.intent.action.MAIN,NULL,NULL,270532608]
06-12 18:43:39.008 1711 13415 I wm_task_moved: [51,1,6]
06-12 18:43:39.012 1711 13415 I wm_pause_activity: [0,134036600,com.android.launcher3/.uioverrides.QuickstepLauncher,userLeaving=true,pauseBackTasks]
# APP端-Launcher
06-12 18:43:39.022 20435 20435 I wm_on_top_resumed_lost_called: [134036600,com.android.launcher3.uioverrides.QuickstepLauncher,topStateChangedWhenResumed]
06-12 18:43:39.024 20435 20435 I wm_on_paused_called: [134036600,com.android.launcher3.uioverrides.QuickstepLauncher,performPause]
# system端
06-12 18:43:39.029 1711 13415 I wm_add_to_stopping: [0,134036600,com.android.launcher3/.uioverrides.QuickstepLauncher,makeInvisible]
06-12 18:43:39.049 1711 1906 I ActivityManager: Start proc 13463:com.demoapp.activitydemo/u0a108 for next-top-activity {com.demoapp.activitydemo/com.demoapp.activitydemo.MainActivity}
06-12 18:43:39.049 1711 1906 I am_proc_start: [0,13463,10108,com.demoapp.activitydemo,next-top-activity,{com.demoapp.activitydemo/com.demoapp.activitydemo.MainActivity}]
06-12 18:43:39.107 1711 3159 I wm_restart_activity: [0,245284976,51,com.demoapp.activitydemo/.MainActivity]
06-12 18:43:39.111 1711 3159 I wm_set_resumed_activity: [0,com.demoapp.activitydemo/.MainActivity,minimalResumeActivityLocked - onActivityStateChanged]
# APP端-ActivityDemo
06-12 18:43:39.270 13463 13463 I wm_on_create_called: [245284976,com.demoapp.activitydemo.MainActivity,performCreate]
06-12 18:43:39.272 13463 13463 I wm_on_start_called: [245284976,com.demoapp.activitydemo.MainActivity,handleStartActivity]
06-12 18:43:39.273 13463 13463 I wm_on_resume_called: [245284976,com.demoapp.activitydemo.MainActivity,RESUME_ACTIVITY]
06-12 18:43:39.288 13463 13463 I wm_on_top_resumed_gained_called: [245284976,com.demoapp.activitydemo.MainActivity,topStateChangedWhenResumed]
# system端
06-12 18:43:39.350 1711 1882 I wm_activity_launch_time: [0,245284976,com.demoapp.activitydemo/.MainActivity,362]
06-12 18:43:39.350 1711 1882 I ActivityTaskManager: Displayed com.demoapp.activitydemo/.MainActivity: +362ms
06-12 18:43:39.582 1711 1885 I wm_stop_activity: [0,134036600,com.android.launcher3/.uioverrides.QuickstepLauncher]
# APP端-Launcher
06-12 18:43:39.602 20435 20435 I wm_on_stop_called: [134036600,com.android.launcher3.uioverrides.QuickstepLauncher,STOP_ACTIVITY_ITEM]
日志-APP内启动
Base on: Android 13
场景:在APP ActivityDemo的MainActivity中,通过调用startActivity(intent)启动SecondActivity。
涉及到的进程:system_server及ActivityDemo。
07-15 00:19:34.171 1607 7870 I ActivityTaskManager: START u0 {flg=0x10000000 cmp=com.demoapp.activitydemo/.SecondActivity} from uid 10108
# system端
07-15 00:19:34.183 1607 7870 I wm_task_moved: [236,1,2]
07-15 00:19:34.184 1607 7870 I wm_create_activity: [0,131796363,236,com.demoapp.activitydemo/.SecondActivity,NULL,NULL,NULL,268435456]
07-15 00:19:34.187 1607 7870 I wm_pause_activity: [0,146902564,com.demoapp.activitydemo/.MainActivity,userLeaving=true,resumeTopActivity]
# APP端-MainActivity
07-15 00:19:34.187 16385 16385 I wm_on_top_resumed_lost_called: [146902564,com.demoapp.activitydemo.MainActivity,topStateChangedWhenResumed]
07-15 00:19:34.194 16385 16385 I wm_on_paused_called: [146902564,com.demoapp.activitydemo.MainActivity,performPause]
# system端
07-15 00:19:34.197 1607 3288 I wm_add_to_stopping: [0,146902564,com.demoapp.activitydemo/.MainActivity,makeInvisible]
07-15 00:19:34.199 1607 3288 I wm_restart_activity: [0,131796363,236,com.demoapp.activitydemo/.SecondActivity]
07-15 00:19:34.201 1607 3288 I wm_set_resumed_activity: [0,com.demoapp.activitydemo/.SecondActivity,minimalResumeActivityLocked - onActivityStateChanged]
# APP端-SecondActivity
07-15 00:19:34.226 16385 16385 I wm_on_create_called: [131796363,com.demoapp.activitydemo.SecondActivity,performCreate]
07-15 00:19:34.228 16385 16385 I wm_on_start_called: [131796363,com.demoapp.activitydemo.SecondActivity,handleStartActivity]
07-15 00:19:34.228 16385 16385 I wm_on_resume_called: [131796363,com.demoapp.activitydemo.SecondActivity,RESUME_ACTIVITY]
07-15 00:19:34.235 16385 16385 I wm_on_top_resumed_gained_called: [131796363,com.demoapp.activitydemo.SecondActivity,topStateChangedWhenResumed]
# system端
07-15 00:19:34.266 1607 1918 I wm_activity_launch_time: [0,131796363,com.demoapp.activitydemo/.SecondActivity,97]
07-15 00:19:34.756 1607 1922 I wm_stop_activity: [0,146902564,com.demoapp.activitydemo/.MainActivity]
07-15 00:19:34.773 16385 16385 I wm_on_stop_called: [146902564,com.demoapp.activitydemo.MainActivity,STOP_ACTIVITY_ITEM]
示例说明
以下以桌面启动APP为例。
Base on: Android 13
Branch: android-13.0.0_r30
注:本例中是以桌面启动Activity为例的,调用端是com.android.launcher3进程。
(1) APP端-Launcher
调用端启动Activity
这里的调用端指调用startActivity(intent)的进程。
- 如果是在桌面点击的应用图标,则调用端是桌面进程,如com.android.launcher、com.android.home或com.miui.home等;
- 如果是在其它APP执行的,那么调用端就是其它APP;
- 如果是在本APP启动APP内的Activity,则调用端就是当前APP,那么之后就不会涉及到”进程不存在”的情况,除非被启动Activity设置了android:process属性。
启动APP内的Activity代码示例:
public class MainActivity extends Activity implements OnClickListener {
private final static String LOG_TAG = "MainActivity";
private Button myButton = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myButton = (Button)findViewById(R.id.myButton);
myButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(v.equals(myButton)) {
Intent intent = new Intent(this, nextActivity.class);
startActivity(intent);
}
}
}
Activity.startActivity()
路径:frameworks/base/core/java/android/app/Activity.java
自定义的MainActivity继承自Activity类,会调用Activity.startActivity()方法,该方法在Activity.java中有两个重载版本。
public class Activity extends ContextThemeWrapper
implements LayoutInflater.Factory2,
Window.Callback, KeyEvent.Callback,
OnCreateContextMenuListener, ComponentCallbacks2,
Window.OnWindowDismissedCallback,
AutofillManager.AutofillClient, ContentCaptureManager.ContentCaptureClient {
//......
@Override
public void startActivity(Intent intent) {
this.startActivity(intent, null);
}
//......
@Override
public void startActivity(Intent intent, @Nullable Bundle options) {
if (mIntent != null && mIntent.hasExtra(AutofillManager.EXTRA_RESTORE_SESSION_TOKEN)
&& mIntent.hasExtra(AutofillManager.EXTRA_RESTORE_CROSS_ACTIVITY)) {
if (TextUtils.equals(getPackageName(),
intent.resolveActivity(getPackageManager()).getPackageName())) {
// Apply Autofill restore mechanism on the started activity by startActivity()
final IBinder token =
mIntent.getIBinderExtra(AutofillManager.EXTRA_RESTORE_SESSION_TOKEN);
// Remove restore ability from current activity
mIntent.removeExtra(AutofillManager.EXTRA_RESTORE_SESSION_TOKEN);
mIntent.removeExtra(AutofillManager.EXTRA_RESTORE_CROSS_ACTIVITY);
// Put restore token
intent.putExtra(AutofillManager.EXTRA_RESTORE_SESSION_TOKEN, token);
intent.putExtra(AutofillManager.EXTRA_RESTORE_CROSS_ACTIVITY, true);
}
}
if (options != null) {
startActivityForResult(intent, -1, options);
} else {
// Note we want to go through this call for compatibility with
// applications that may have overridden the method.
startActivityForResult(intent, -1);
}
}
//......
}
startActivity()有两个重载函数,最终都会调用startActivity(Intent, Bundle)这个方法,其中Bundle类用于传递数据。
在startActivity()中最后会调用startActivityForResult()。
Activity.startActivityForResult()
startActivityForResult()有两个重载函数,但最终都会调用startActivityForResult(intent, requestCode, options)。startActivityForResult()的第二个参数为 -1,表示 Launcher 不需要知道 Activity 启动的结果。
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode) {
startActivityForResult(intent, requestCode, null);
}
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
@Nullable Bundle options) {
if (mParent == null) {
options = transferSpringboardActivityOptions(options);
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode, options);
if (ar != null) {
mMainThread.sendActivityResult(
mToken, mEmbeddedID, requestCode, ar.getResultCode(),
ar.getResultData());
}
if (requestCode >= 0) {
// If this start is requesting a result, we can avoid making
// the activity visible until the result is received. Setting
// this code during onCreate(Bundle savedInstanceState) or onResume() will keep the
// activity hidden during this time, to avoid flickering.
// This can only be done when a result is requested because
// that guarantees we will get information back when the
// activity is finished, no matter what happens to it.
mStartedActivity = true;
}
cancelInputsAndStartExitTransition(options);
// TODO Consider clearing/flushing other event sources and events for child windows.
} else {
if (options != null) {
mParent.startActivityFromChild(this, intent, requestCode, options);
} else {
// Note we want to go through this method for compatibility with
// existing applications that may have overridden it.
mParent.startActivityFromChild(this, intent, requestCode);
}
}
}
接下来主要调用Instrumentation类的execStartActivity()方法,Instrumentation 类主要用来监控应用程序和系统的交互。
Instrumentation.execStartActivity()
路径:/frameworks/base/core/java/android/app/Instrumentation.java
public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, Activity target,
Intent intent, int requestCode, Bundle options) {
IApplicationThread whoThread = (IApplicationThread) contextThread;
Uri referrer = target != null ? target.onProvideReferrer() : null;
if (referrer != null) {
intent.putExtra(Intent.EXTRA_REFERRER, referrer);
}
if (mActivityMonitors != null) {
synchronized (mSync) {
final int N = mActivityMonitors.size();
for (int i=0; i<N; i++) {
final ActivityMonitor am = mActivityMonitors.get(i);
ActivityResult result = null;
if (am.ignoreMatchingSpecificIntents()) {
result = am.onStartActivity(intent);
}
if (result != null) {
am.mHits++;
return result;
} else if (am.match(who, null, intent)) {
am.mHits++;
if (am.isBlocking()) {
return requestCode >= 0 ? am.getResult() : null;
}
break;
}
}
}
}
try {
intent.migrateExtraStreamToClipData(who);
intent.prepareToLeaveProcess(who);
int result = ActivityTaskManager.getService().startActivity(whoThread,
who.getBasePackageName(), who.getAttributionTag(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()), token,
target != null ? target.mEmbeddedID : null, requestCode, 0, null, options);
checkStartActivityResult(result, intent);
} catch (RemoteException e) {
throw new RuntimeException("Failure from system", e);
}
return null;
}
execStartActivity()中会调用 ActivityTaskManager.getService().startActivity(),ActivityTaskManager.getService()通过Binder调用获取ActivityTaskManagerService的代理对象,按着调用它的 startActivity 方法。此处startActivity()的共有11个参数。
(2) system端
共有流程
ActivityTaskManagerService.startActivity() ->
ActivityTaskManagerService.startActivityAsUser() ->
ActivityTaskManagerService.startActivityAsUser() ->
ActivityStarter.execute() ->
ActivityStarter.executeRequest() ->
ActivityStarter.startActivityUnchecked() ->
ActivityStarter.startActivityInner()
ATMS.startActivity()
ATMS=ActivityTaskManagerService
@Override
public final int startActivity(IApplicationThread caller, String callingPackage,
String callingFeatureId, Intent intent, String resolvedType, IBinder resultTo,
String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo,
Bundle bOptions) {
return startActivityAsUser(caller, callingPackage, callingFeatureId, intent, resolvedType,
resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions,
UserHandle.getCallingUserId());
}
- caller: 当前应用的ApplicationThread对象mAppThread;
- callingPackage: 调用当前ContextImpl.getBasePackageName(),获取当前Activity所在包名;
- intent: 这便是启动Activity时,传递过来的参数;
- resolvedType: 调用intent.resolveTypeIfNeeded而获取;
- resultTo: 来自于当前Activity.mToken;
- resultWho: 来自于当前Activity.mEmbeddedID;
- requestCode = -1;
- startFlags = 0;
- profilerInfo = null;
- options = null;
startActivity()中调用startActivityAsUser()。startActivityAsUser()比AMS的startActivity()多了一个参数 UserHandle.getCallingUserId(),这个方法会获得调用者的 UserId,AMS 根据这个 UserId 来确定调用者的权限。
ATMS.startActivityAsUser()
startActivityAsUser()一共有两个重载方法,但最终都会调用13参数的那个方法。比另一个方法多了boolean validateIncomingUser这个参数,且默认为true。
@Override
public int startActivityAsUser(IApplicationThread caller, String callingPackage,
String callingFeatureId, Intent intent, String resolvedType, IBinder resultTo,
String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo,
Bundle bOptions, int userId) {
return startActivityAsUser(caller, callingPackage, callingFeatureId, intent, resolvedType,
resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions, userId,
true /*validateIncomingUser*/);
}
private int startActivityAsUser(IApplicationThread caller, String callingPackage,
@Nullable String callingFeatureId, Intent intent, String resolvedType,
IBinder resultTo, String resultWho, int requestCode, int startFlags,
ProfilerInfo profilerInfo, Bundle bOptions, int userId, boolean validateIncomingUser) {
assertPackageMatchesCallingUid(callingPackage);
//判断调用者进程是否被隔离
enforceNotIsolatedCaller("startActivityAsUser");
//检查调用者权限
userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser,
Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");
// TODO: Switch to user app stacks here.
return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
.setCaller(caller)
.setCallingPackage(callingPackage)
.setCallingFeatureId(callingFeatureId)
.setResolvedType(resolvedType)
.setResultTo(resultTo)
.setResultWho(resultWho)
.setRequestCode(requestCode)
.setStartFlags(startFlags)
.setProfilerInfo(profilerInfo)
.setActivityOptions(bOptions)
.setUserId(userId)
.execute();
}
如果调用者进程被隔离或者无权限,会抛出 SecurityException 异常。
startActivityAsUser()主要部分为最后的return语句。
getActivityStartController()获取到一个 ActivityStartController对象。然后调用ActivityStartController.obtainStarter(),获取一个ActivityStarter对象。然后ActivityStarter调用一系列的set()函数。
ActivityStarter.setxxx()
ActivityStarter 是 Android 7.0 中新加入的类,它是加载 Activity 的控制类,会收集所有的逻辑来决定如何将 Intent 和 Flags 转换为 Activity。
ActivityStarter中的set系列方法用于赋值。
ActivityStarter setCaller(IApplicationThread caller) {
mRequest.caller = caller;
return this;
}
ActivityStarter setCallingPackage(String callingPackage) {
mRequest.callingPackage = callingPackage;
return this;
}
ActivityStarter setCallingFeatureId(String callingFeatureId) {
mRequest.callingFeatureId = callingFeatureId;
return this;
}
ActivityStarter setResolvedType(String type) {
mRequest.resolvedType = type;
return this;
}
//......
可见所有值都赋给了一个mRequest变量,mRequest是一个Request对象。是ActivityStarter的一个内部类。
最终会执行一个execute()方法。
ActivityStarter.execute()
/**
* Resolve necessary information according the request parameters provided earlier, and execute
* the request which begin the journey of starting an activity.
* @return The starter result.
*/
int execute() {
try {
// Refuse possible leaked file descriptors
if (mRequest.intent != null && mRequest.intent.hasFileDescriptors()) {
throw new IllegalArgumentException("File descriptors passed in Intent");
}
final LaunchingState launchingState;
synchronized (mService.mGlobalLock) {
final ActivityRecord caller = ActivityRecord.forTokenLocked(mRequest.resultTo);
launchingState = mSupervisor.getActivityMetricsLogger().notifyActivityLaunching(
mRequest.intent, caller);
}
// If the caller hasn't already resolved the activity, we're willing
// to do so here. If the caller is already holding the WM lock here,
// and we need to check dynamic Uri permissions, then we're forced
// to assume those permissions are denied to avoid deadlocking.
if (mRequest.activityInfo == null) {
mRequest.resolveActivity(mSupervisor);
}
int res;
synchronized (mService.mGlobalLock) {
final boolean globalConfigWillChange = mRequest.globalConfig != null
&& mService.getGlobalConfiguration().diff(mRequest.globalConfig) != 0;
final ActivityStack stack = mRootWindowContainer.getTopDisplayFocusedStack();
if (stack != null) {
stack.mConfigWillChange = globalConfigWillChange;
}
if (DEBUG_CONFIGURATION) {
Slog.v(TAG_CONFIGURATION, "Starting activity when config will change = "
+ globalConfigWillChange);
}
final long origId = Binder.clearCallingIdentity();
res = resolveToHeavyWeightSwitcherIfNeeded();
if (res != START_SUCCESS) {
return res;
}
res = executeRequest(mRequest);
Binder.restoreCallingIdentity(origId);
if (globalConfigWillChange) {
// If the caller also wants to switch to a new configuration, do so now.
// This allows a clean switch, as we are waiting for the current activity
// to pause (so we will not destroy it), and have not yet started the
// next activity.
mService.mAmInternal.enforceCallingPermission(
android.Manifest.permission.CHANGE_CONFIGURATION,
"updateConfiguration()");
if (stack != null) {
stack.mConfigWillChange = false;
}
if (DEBUG_CONFIGURATION) {
Slog.v(TAG_CONFIGURATION,
"Updating to new configuration after starting activity.");
}
mService.updateConfigurationLocked(mRequest.globalConfig, null, false);
}
// Notify ActivityMetricsLogger that the activity has launched.
// ActivityMetricsLogger will then wait for the windows to be drawn and populate
// WaitResult.
mSupervisor.getActivityMetricsLogger().notifyActivityLaunched(launchingState, res,
mLastStartActivityRecord);
return getExternalResult(mRequest.waitResult == null ? res
: waitForResult(res, mLastStartActivityRecord));
}
} finally {
onExecutionComplete();
}
}
ActivityStarter.executeRequest()
private int executeRequest(Request request) {
//......
mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession,
request.voiceInteractor, startFlags, true /* doResume */, checkedOptions, inTask,
restrictedBgActivity, intentGrants);
if (request.outActivity != null) {
request.outActivity[0] = mLastStartActivityRecord;
}
return mLastStartActivityResult;
}
ActivityStarter.startActivityUnchecked()
startActivityUnchecked()主要处理与栈管理相关的逻辑。
/**
* Start an activity while most of preliminary checks has been done and caller has been
* confirmed that holds necessary permissions to do so.
* Here also ensures that the starting activity is removed if the start wasn't successful.
*/
private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,
IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
int startFlags, boolean doResume, ActivityOptions options, Task inTask,
boolean restrictedBgActivity, NeededUriGrants intentGrants) {
int result = START_CANCELED;
final ActivityStack startedActivityStack;
try {
mService.deferWindowLayout();
Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "startActivityInner");
result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor,
startFlags, doResume, options, inTask, restrictedBgActivity, intentGrants);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
startedActivityStack = handleStartResult(r, result);
mService.continueWindowLayout();
}
postStartActivityProcessing(r, result, startedActivityStack);
return result;
}
ActivityStarter.startActivityInner()
int startActivityInner(final ActivityRecord r, ActivityRecord sourceRecord,
IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
int startFlags, boolean doResume, ActivityOptions options, Task inTask,
boolean restrictedBgActivity, NeededUriGrants intentGrants) {
setInitialState(r, options, inTask, doResume, startFlags, sourceRecord, voiceSession,
voiceInteractor, restrictedBgActivity);
//......
if (mDoResume) {
final ActivityRecord topTaskActivity =
mStartActivity.getTask().topRunningActivityLocked();
if (!mTargetStack.isTopActivityFocusable()
|| (topTaskActivity != null && topTaskActivity.isTaskOverlay()
&& mStartActivity != topTaskActivity)) {
// If the activity is not focusable, we can't resume it, but still would like to
// make sure it becomes visible as it starts (this will also trigger entry
// animation). An example of this are PIP activities.
// Also, we don't want to resume activities in a task that currently has an overlay
// as the starting activity just needs to be in the visible paused state until the
// over is removed.
// Passing {@code null} as the start parameter ensures all activities are made
// visible.
mTargetStack.ensureActivitiesVisible(null /* starting */,
0 /* configChanges */, !PRESERVE_WINDOWS);
// Go ahead and tell window manager to execute app transition for this activity
// since the app transition will not be triggered through the resume channel.
mTargetStack.getDisplay().mDisplayContent.executeAppTransition();
} else {
// If the target stack was not previously focusable (previous top running activity
// on that stack was not visible) then any prior calls to move the stack to the
// will not update the focused stack. If starting the new activity now allows the
// task stack to be focusable, then ensure that we now update the focused stack
// accordingly.
if (mTargetStack.isTopActivityFocusable()
&& !mRootWindowContainer.isTopDisplayFocusedStack(mTargetStack)) {
mTargetStack.moveToFront("startActivityInner");
}
mRootWindowContainer.resumeFocusedStacksTopActivities(
mTargetStack, mStartActivity, mOptions);
}
}
mRootWindowContainer.updateUserStack(mStartActivity.mUserId, mTargetStack);
// Update the recent tasks list immediately when the activity starts
mSupervisor.mRecentTasks.add(mStartActivity.getTask());
mSupervisor.handleNonResizableTaskIfNeeded(mStartActivity.getTask(),
mPreferredWindowingMode, mPreferredTaskDisplayArea, mTargetStack);
return START_SUCCESS;
}
启动一个活动,并决定该活动是否应该添加到一个现有任务的顶部,或交付新的意图到一个现有的活动。同时操作活动任务到被请求的或有效的堆栈/显示上。
之后在ActivityStarter.startActivityInner()又分为两路,最终都会调用到ClientTransaction.schedule(),然后调用到APP端。
创建ClientTransaction-1
从Task.moveToFront() -> ClientTransaction.schedule(),经过一系列调用,生成ClientTransaction事务对象,该对象包含TopResumedActivityChangeItem回调执行请求,然后传递到APP端。
(1) 堆栈
ActivityStarter.startActivityInner() ->
Task.moveToFront() ->
TaskDisplayArea.positionChildAt() ->
TaskDisplayArea.positionChildTaskAt() ->
ActivityTaskSupervisor.updateTopResumedActivityIfNeeded() ->
ActivityRecord.scheduleTopResumedActivityChanged() ->
ClientLifecycleManager.scheduleTransaction() ->
ClientLifecycleManager.scheduleTransaction() ->
ClientTransaction.schedule()
(2) ClientTransaction对象
this的内容如下:
- mActivityCallbacks包含一个TopResumedActivityChangeItem对象,执行该对象的回调;
- mLifecycleStateRequest = null,所以不会执行任何生命周期方法。
创建ClientTransaction-2
从RootWindowContainer.resumeFocusedTasksTopActivities() -> ClientTransaction.schedule(),经过一系列调用,生成ClientTransaction事务对象,该对象包含TopResumedActivityChangeItem回调执行请求,然后传递到APP端。
(1) 堆栈
ActivityStarter.startActivityInner() ->
RootWindowContainer.resumeFocusedTasksTopActivities() ->
Task.resumeTopActivityUncheckedLocked() ->
Task.resumeTopActivityInnerLocked() ->
TaskFragment.resumeTopActivity() ->
TaskDisplayArea.pauseBackTasks() ->
WindowContainer.forAllLeafTasks() ->
Task.forAllLeafTasks() ->
Task.forAllLeafTasks() ->
// Consumer接口调用过程,构造于TaskDisplayArea.pauseBackTasks()
TaskFragment.forAllLeafTaskFragments() ->
// Consumer接口调用过程,构造于TaskDisplayArea.pauseBackTasks()
TaskFragment.startPausing() ->
TaskFragment.startPausing() ->
TaskFragment.schedulePauseActivity() ->
ClientLifecycleManager.scheduleTransaction() ->
ClientLifecycleManager.scheduleTransaction() ->
ClientTransaction.schedule()
(2) ClientTransaction对象
this的内容如下:
- mActivityCallbacks=null;
- mLifecycleStateRequest为一个PauseActivityItem对象,之后APP端通过该对象执行onPause();
- 之后还会通过PauseActivityItem.postExecute() -> ActivityClient.activityPaused()调用回system端。
关键过程
START u0
说明:打印START ux日志,x表示userId。
日志示例:
ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.demoapp.activitydemo/.MainActivity bnds=[81,772][253,944] (has extras)} from uid 10128 from pid 15720 callingPackage com.miui.home
(1) 打印位置
ActivityStarter.executeRequest(Request request)
int err = ActivityManager.START_SUCCESS;
// Pull the optional Ephemeral Installer-only bundle out of the options early.
final Bundle verificationBundle =
options != null ? options.popAppVerificationBundle() : null;
WindowProcessController callerApp = null;
if (caller != null) {
callerApp = mService.getProcessController(caller);
if (callerApp != null) {
callingPid = callerApp.getPid();
callingUid = callerApp.mInfo.uid;
} else {
Slog.w(TAG, "Unable to find app for caller " + caller + " (pid=" + callingPid
+ ") when starting: " + intent.toString());
err = START_PERMISSION_DENIED;
}
}
final int userId = aInfo != null && aInfo.applicationInfo != null
? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0;
if (err == ActivityManager.START_SUCCESS) {
Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true, true, false)
+ "} from uid " + callingUid);
}
(2) 堆栈
Binder: IActivityTaskManager.Stub.onTransact() ->
ATMS.startActivity() ->
ActivityTaskManagerService.startActivityAsUser() ->
ActivityTaskManagerService.startActivityAsUser() ->
ActivityStarter.execute() ->
ActivityStarter.executeRequest()
wm_create_activity
说明:表示将要对该Activity执行onCreate()。
日志示例:
06-12 18:43:39.008 1711 13415 I wm_create_activity: [0,245284976,51,com.demoapp.activitydemo/.MainActivity,android.intent.action.MAIN,NULL,NULL,270532608]
(1) 打印位置
ActivityStarter.startActivityInner()
mStartActivity.logStartActivity(EventLogTags.WM_CREATE_ACTIVITY, startedTask);
ActivityRecord.logStartActivity()
void logStartActivity(int tag, Task task) {
final Uri data = intent.getData();
final String strData = data != null ? data.toSafeString() : null;
EventLog.writeEvent(tag,
mUserId, System.identityHashCode(this), task.mTaskId,
shortComponentName, intent.getAction(),
intent.getType(), strData, intent.getFlags());
}
(2) 堆栈
ActivityTaskManagerService.startActivity() ->
ActivityTaskManagerService.startActivityAsUser() ->
ActivityTaskManagerService.startActivityAsUser() ->
ActivityStarter.execute() ->
ActivityStarter.executeRequest() ->
ActivityStarter.startActivityUnchecked() ->
ActivityStarter.startActivityInner() ->
ActivityRecord.logStartActivity()
wm_pause_activity
说明:表示将要对该Activity执行onPause()。
日志示例:
06-12 18:43:39.012 1711 13415 I wm_pause_activity: [0,134036600,com.android.launcher3/.uioverrides.QuickstepLauncher,userLeaving=true,pauseBackTasks]
(3) APP端-Launcher
作用:执行APP端的onPause()
system端有连续两次调用到此APP端。
共有过程如下:
ApplicationThread.scheduleTransaction() ->
ClientTransactionHandler.scheduleTransaction() ->
sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction) ->
ActivityThread.H.handleMessage(Message msg) ->
TransactionExecutor.execute()
执行ClientTransaction-1
第1次执行的是之前system的Task.moveToFront()调用过来的第1个ClientTransaction事务。
在TransactionExecutor.execute(transaction)中:
- 只是执行executeCallbacks(transaction);
- 不会执行executeLifecycleState(transaction),因为lifecycleItem = null,直接return。
执行ClientTransaction-2
第2次执行的是之前system的RootWindowContainer.resumeFocusedTasksTopActivities()调用过来的第2个ClientTransaction事务。
在TransactionExecutor.execute(transaction)中:
- 不会执行executeCallbacks(transaction),因为callbacks == null;
- 执行executeLifecycleState(transaction),调用到onPause()生命周期方法;
- 最后从executeLifecycleState(transaction)中调用回system端。
(1) 调用到onPause()的堆栈如下
TransactionExecutor.execute() ->
TransactionExecutor.executeLifecycleState() ->
ActivityTransactionItem.execute() ->
PauseActivityItem.execute() ->
ActivityThread.handlePauseActivity() ->
ActivityThread.performPauseActivity() ->
ActivityThread.performPauseActivityIfNeeded() ->
Instrumentation.callActivityOnPause() ->
Activity.performPause() ->
Launcher.onPause()
注:Launcher即桌面。
调用到system
调用回system端的堆栈如下:
TransactionExecutor.execute() ->
TransactionExecutor.executeLifecycleState() ->
PauseActivityItem.postExecute() ->
ActivityClient.activityPaused()
之后调用到ActivityClientController.activityPaused(token)。
(4) system端
共有流程
IActivityClientController$Stub.onTransact() ->
ActivityClientController.activityPaused() ->
ActivityRecord.activityPaused() ->
TaskFragment.completePause() ->
RootWindowContainer.resumeFocusedTasksTopActivities() ->
RootWindowContainer.resumeFocusedTasksTopActivities() ->
Task.resumeTopActivityUncheckedLocked() ->
Task.resumeTopActivityInnerLocked() ->
TaskFragment.resumeTopActivity() ->
ActivityTaskSupervisor.startSpecificActivity()
ATS.startSpecificActivity()
ATS=ActivityTaskSupervisor
在这里分两种情况,进程已启动或进程未启动。
void startSpecificActivity(ActivityRecord r, boolean andResume, boolean checkConfig) {
// Is this activity's application already running?
final WindowProcessController wpc =
mService.getProcessController(r.processName, r.info.applicationInfo.uid);
boolean knownToBeDead = false;
if (wpc != null && wpc.hasThread()) {
try {
realStartActivityLocked(r, wpc, andResume, checkConfig);
return;
} catch (RemoteException e) {
Slog.w(TAG, "Exception when starting activity "
+ r.intent.getComponent().flattenToShortString(), e);
}
// If a dead object exception was thrown -- fall through to
// restart the application.
knownToBeDead = true;
// Remove the process record so it won't be considered as alive.
mService.mProcessNames.remove(wpc.mName, wpc.mUid);
mService.mProcessMap.remove(wpc.getPid());
}
r.notifyUnknownVisibilityLaunchedForKeyguardTransition();
final boolean isTop = andResume && r.isTopRunningActivity();
mService.startProcessAsync(r, knownToBeDead, isTop,
isTop ? HostingRecord.HOSTING_TYPE_TOP_ACTIVITY
: HostingRecord.HOSTING_TYPE_ACTIVITY);
}
进程已存在
如果当前Activity所在进程已启动,则直接调用realStartActivityLocked()。
ActivityClientController.activityPaused() ->
ActivityRecord.activityPaused() ->
TaskFragment.completePause() ->
RootWindowContainer.resumeFocusedTasksTopActivities() ->
RootWindowContainer.resumeFocusedTasksTopActivities() ->
Task.resumeTopActivityUncheckedLocked() ->
Task.resumeTopActivityInnerLocked() ->
TaskFragment.resumeTopActivity() ->
ActivityTaskSupervisor.startSpecificActivity() ->
ActivityTaskSupervisor.realStartActivityLocked()
之后在ATS.realStartActivityLocked()通过ClientLifecycleManager.getLifecycleManager()和Task.minimalResumeActivityLocked()分别调用到APP端。
第1次:
ActivityTaskSupervisor.realStartActivityLocked() ->
ClientLifecycleManager.scheduleTransaction() ->
ClientTransaction.schedule()
第2次:
ActivityTaskSupervisor.realStartActivityLocked() ->
Task.minimalResumeActivityLocked() ->
ActivityRecord.setState() ->
TaskFragment.onActivityStateChanged() ->
TaskFragment.setResumedActivity() ->
ActivityTaskSupervisor.updateTopResumedActivityIfNeeded() ->
ActivityTaskSupervisor.scheduleTopResumedActivityStateIfNeeded() ->
ActivityRecord.scheduleTopResumedActivityChanged() ->
ClientLifecycleManager.scheduleTransaction() ->
ClientLifecycleManager.scheduleTransaction() ->
ClientTransaction.schedule()
进程不存在
若进程不存在,则执行ATMS.startProcessAsync()先创建进程:
ATMS.startProcessAsync() ->
AMS.startProcess() ->
AMS.startProcessLocked() ->
ProcessList.startProcessLocked(14 args) ->
ProcessList.handleProcessStart() ->
ProcessList.startProcess() ->
// Zygote流程…
// 被启动的APP进程
ActivityThread.main() ->
ActivityThread.attach() ->
// system端,之后最终走到ATS.realStartActivityLocked()
ActivityManagerService.attachApplication() ->
ActivityManagerService.attachApplicationLocked() ->
ActivityTaskManagerService$LocalService.attachApplication() ->
RootWindowContainer.attachApplication() ->
RootWindowContainer$AttachApplicationHelper.process() ->
WindowContainer.forAllRootTasks() ->
WindowContainer.forAllRootTasks() ->
WindowContainer.forAllRootTasks() ->
WindowContainer.forAllRootTasks() ->
WindowContainer.forAllRootTasks() ->
WindowContainer.forAllRootTasks() ->
WindowContainer.forAllRootTasks() ->
Task.forAllRootTasks() ->
RootWindowContainer$AttachApplicationHelper.accept() ->
RootWindowContainer$AttachApplicationHelper.accept() ->
WindowContainer.forAllActivities() ->
WindowContainer.forAllActivities() ->
ActivityRecord.forAllActivities() ->
RootWindowContainer$AttachApplicationHelper.test() ->
RootWindowContainer$AttachApplicationHelper.test() ->
ActivityTaskSupervisor.realStartActivityLocked()
之后的调用栈和进程已启动一样,通过ClientLifecycleManager.getLifecycleManager()和Task.minimalResumeActivityLocked()分别调用到APP端。
ATS.realStartActivityLocked()
ATS=ActivityTaskSupervisor
执行到此处,无论之前进程是否已启动,在这里则都启动了。
在这里直接生成一个ClientTransaction事务对象并调用到APP端。
// Create activity launch transaction.
final ClientTransaction clientTransaction = ClientTransaction.obtain(
proc.getThread(), r.token);
final boolean isTransitionForward = r.isTransitionForward();
final IBinder fragmentToken = r.getTaskFragment().getFragmentToken();
clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),
System.identityHashCode(r), r.info,
// TODO: Have this take the merged configuration instead of separate global
// and override configs.
mergedConfiguration.getGlobalConfiguration(),
mergedConfiguration.getOverrideConfiguration(), r.compat,
r.getFilteredReferrer(r.launchedFromPackage), task.voiceInteractor,
proc.getReportedProcState(), r.getSavedState(), r.getPersistentSavedState(),
results, newIntents, r.takeOptions(), isTransitionForward,
proc.createProfilerInfoIfNeeded(), r.assistToken, activityClientController,
r.shareableActivityToken, r.getLaunchedFromBubble(), fragmentToken));
// Set desired final state.
final ActivityLifecycleItem lifecycleItem;
if (andResume) {
lifecycleItem = ResumeActivityItem.obtain(isTransitionForward);
} else {
lifecycleItem = PauseActivityItem.obtain();
}
clientTransaction.setLifecycleStateRequest(lifecycleItem);
// Schedule transaction.
mService.getLifecycleManager().scheduleTransaction(clientTransaction);
在这里通过Task.minimalResumeActivityLocked()流程也会创建一个ClientTransaction事务并调用到APP端。
// so updating the state should be done accordingly.
if (andResume && readyToResume()) {
// As part of the process of launching, ActivityThread also performs
// a resume.
rootTask.minimalResumeActivityLocked(r);
} else {
// This activity is not starting in the resumed state... which should look like we asked
// it to pause+stop (but remain visible), and it has done so and reported back the
// current icicle and other state.
ProtoLog.v(WM_DEBUG_STATES, "Moving to PAUSED: %s "
+ "(starting in paused state)", r);
r.setState(PAUSED, "realStartActivityLocked");
mRootWindowContainer.executeAppTransitionForAllDisplay();
}
创建ClientTransaction-1
无论进程是否启动,都会从ATS.realStartActivityLocked()调用到这里来。此次Binder线程中第1次生成ClientTransaction事务对象,该对象包含LaunchActivityItem回调执行请求和ResumeActivityItem生命周期执行请求,然后传递到APP端。
(2) 堆栈
ActivityTaskSupervisor.realStartActivityLocked() ->
ClientLifecycleManager.scheduleTransaction() ->
ClientTransaction.schedule() ->
(1) ClientTransaction对象
this的内容如下:
- mActivityCallbacks包含一个LaunchActivityItem对象,执行该对象的回调;
- mLifecycleStateRequest为一个ResumeActivityItem对象,之后APP端通过该对象执行onResume()。
创建ClientTransaction-2
从RootWindowContainer.resumeFocusedTasksTopActivities() -> ClientTransaction.schedule(),经过一系列调用,生成ClientTransaction事务对象,该对象包含TopResumedActivityChangeItem回调执行请求,然后传递到APP端。
(1) 堆栈
ActivityTaskSupervisor.realStartActivityLocked() ->
Task.minimalResumeActivityLocked() ->
ActivityRecord.setState() ->
TaskFragment.onActivityStateChanged() ->
TaskFragment.setResumedActivity() ->
ActivityTaskSupervisor.updateTopResumedActivityIfNeeded() ->
ActivityTaskSupervisor.scheduleTopResumedActivityStateIfNeeded() ->
ActivityRecord.scheduleTopResumedActivityChanged() ->
ClientLifecycleManager.scheduleTransaction() ->
ClientLifecycleManager.scheduleTransaction() ->
ClientTransaction.schedule()
(1) ClientTransaction对象
this的内容如下:
- mActivityCallbacks包含一个TopResumedActivityChangeItem对象,执行该对象的回调;
- mLifecycleStateRequest=null。
关键过程
wm_add_to_stopping
说明:将上一个Activity加入到ActivityTaskSupervisor.mStoppingActivities列表中。
(1) 打印位置
/** List of activities that are ready to be stopped, but waiting for the next activity to
* settle down before doing so. */
final ArrayList<ActivityRecord> mStoppingActivities = new ArrayList<>();
ActivityRecord.addToStopping()
if (!mTaskSupervisor.mStoppingActivities.contains(this)) {
EventLogTags.writeWmAddToStopping(mUserId, System.identityHashCode(this),
shortComponentName, reason);
mTaskSupervisor.mStoppingActivities.add(this);
}
(2) 堆栈
ActivityClientController.activityPaused() ->
ActivityRecord.activityPaused() ->
TaskFragment.completePause() ->
RootWindowContainer.ensureActivitiesVisible() ->
RootWindowContainer.ensureActivitiesVisible() ->
DisplayContent.ensureActivitiesVisible() ->
WindowContainer.forAllRootTasks() ->
WindowContainer.forAllRootTasks() ->
WindowContainer.forAllRootTasks() ->
WindowContainer.forAllRootTasks() ->
WindowContainer.forAllRootTasks() ->
WindowContainer.forAllRootTasks() ->
WindowContainer.forAllRootTasks() ->
Task.forAllRootTasks() ->
// Consumer接口调用过程,构造于DisplayContent.ensureActivitiesVisible()
Task.ensureActivitiesVisible() ->
Task.forAllLeafTasks() ->
Task.forAllLeafTasks() ->
// Consumer接口调用过程,构造于Task.ensureActivitiesVisible()
TaskFragment.updateActivityVisibilities() ->
EnsureActivitiesVisibleHelper.process() ->
EnsureActivitiesVisibleHelper.setActivityVisibilityState() ->
ActivityRecord.makeInvisible() ->
ActivityRecord.addToStopping()
(5) APP端-ActivityDemo
system端有连续两次调用到待启动Activity的APP端。
共有过程如下:
ApplicationThread.scheduleTransaction() ->
ClientTransactionHandler.scheduleTransaction() ->
sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction) ->
ActivityThread.H.handleMessage(Message msg) ->
TransactionExecutor.execute()
执行ClientTransaction-1
第1次执行的是之前system的Activity.setState()调用过来的第1个ClientTransaction事务。
在TransactionExecutor.execute(transaction)中:
- 执行executeCallbacks(transaction),会调用到onCreate();
- 执行executeLifecycleState(transaction),会调用到onStart()、onResume();
- 最后通过ActivityClient.activityResumed()调用回system端。
TransactionExecutor.executeCallbacks()
final int size = callbacks.size();
for (int i = 0; i < size; ++i) {
final ClientTransactionItem item = callbacks.get(i);
if (DEBUG_RESOLVER) Slog.d(TAG, tId(transaction) + "Resolving callback: " + item);
final int postExecutionState = item.getPostExecutionState();
final int closestPreExecutionState = mHelper.getClosestPreExecutionState(r,
item.getPostExecutionState());
if (closestPreExecutionState != UNDEFINED) {
cycleToPath(r, closestPreExecutionState, transaction);
}
item.execute(mTransactionHandler, token, mPendingActions);
item.postExecute(mTransactionHandler, token, mPendingActions);
if (r == null) {
// Launch activity request will create an activity record.
r = mTransactionHandler.getActivityClient(token);
}
if (postExecutionState != UNDEFINED && r != null) {
// Skip the very last transition and perform it by explicit state request instead.
final boolean shouldExcludeLastTransition =
i == lastCallbackRequestingState && finalState == postExecutionState;
cycleToPath(r, postExecutionState, shouldExcludeLastTransition, transaction);
}
}
onCreate()生命周期
ActivityThread$H.handleMessage() ->
TransactionExecutor.execute() ->
TransactionExecutor.executeCallbacks() ->
LaunchActivityItem.execute() ->
ActivityThread.handleLaunchActivity() ->
ActivityThread.performLaunchActivity() ->
Instrumentation.callActivityOnCreate() ->
Activity.performCreate() ->
Activity.performCreate() ->
MainActivity.onCreate() ->
FragmentActivity.onCreate() ->
ComponentActivity.onCreate() ->
ComponentActivity.onCreate() ->
Activity.onCreate()
TransactionExecutor.executeLifecycleState()
通过cycleToPath()执行onStart()生命周期,通过lifecycleItem.execute()执行onResume(),最后通过lifecycleItem.postExecute()调用到system端。
/** Transition to the final state if requested by the transaction. */
private void executeLifecycleState(ClientTransaction transaction) {
final ActivityLifecycleItem lifecycleItem = transaction.getLifecycleStateRequest();
if (lifecycleItem == null) {
// No lifecycle request, return early.
return;
}
final IBinder token = transaction.getActivityToken();
final ActivityClientRecord r = mTransactionHandler.getActivityClient(token);
if (DEBUG_RESOLVER) {
Slog.d(TAG, tId(transaction) + "Resolving lifecycle state: "
+ lifecycleItem + " for activity: "
+ getShortActivityName(token, mTransactionHandler));
}
if (r == null) {
// Ignore requests for non-existent client records for now.
return;
}
// Cycle to the state right before the final requested state.
cycleToPath(r, lifecycleItem.getTargetState(), true /* excludeLastState */, transaction);
// Execute the final transition with proper parameters.
lifecycleItem.execute(mTransactionHandler, token, mPendingActions);
lifecycleItem.postExecute(mTransactionHandler, token, mPendingActions);
}
onStart()生命周期
ActivityThread$H.handleMessage() ->
TransactionExecutor.execute() ->
TransactionExecutor.executeLifecycleState() ->
TransactionExecutor.cycleToPath() ->
TransactionExecutor.performLifecycleSequence() ->
ActivityThread.handleStartActivity() ->
Activity.performStart() ->
Instrumentation.callActivityOnStart() ->
MainActivity.onStart() ->
AppCompatActivity.onStart() ->
FragmentActivity.onStart() ->
Activity.onStart()
onResume()生命周期
ActivityThread$H.handleMessage() ->
TransactionExecutor.execute() ->
TransactionExecutor.executeLifecycleState() ->
ActivityTransactionItem.execute() ->
ResumeActivityItem.execute() ->
ActivityThread.handleResumeActivity() ->
ActivityThread.performResumeActivity() ->
Activity.performResume() ->
Instrumentation.callActivityOnResume() ->
MainActivity.onResume() ->
FragmentActivity.onResume() ->
Activity.onResume()
执行ClientTransaction-2
第2次执行的是之前system的RootWindowContainer.resumeFocusedTasksTopActivities()调用过来的ClientTransaction事务。
在TransactionExecutor.execute(transaction)中:
- 只是执行executeCallbacks(transaction),是一个TopResumedActivityChangeItem对象;
- 不会执行executeLifecycleState(transaction),因为lifecycleItem = null,直接return。
调用到system
调用回system端的堆栈如下:
TransactionExecutor.execute() ->
TransactionExecutor.executeLifecycleState(){
final ActivityLifecycleItem lifecycleItem = transaction.getLifecycleStateRequest();
lifecycleItem.postExecute(mTransactionHandler, token, mPendingActions);
} ->
ResumeActivityItem.postExecute() ->
ActivityClient.activityResumed()
public void activityResumed(IBinder token, boolean handleSplashScreenExit) {
try {
getActivityClientController().activityResumed(token, handleSplashScreenExit);
} catch (RemoteException e) {
e.rethrowFromSystemServer();
}
}
调用到system的ActivityClientController.activityResumed()。
@Override
public void activityResumed(IBinder token, boolean handleSplashScreenExit) {
final long origId = Binder.clearCallingIdentity();
synchronized (mGlobalLock) {
ActivityRecord.activityResumedLocked(token, handleSplashScreenExit);
}
Binder.restoreCallingIdentity(origId);
}
主要是设置ActivityRecord对象的状态,之后不会再回调到APP端。
(6)system&Home-onStop()
创建ClientTransaction
Stop流程开始执行是从之前的ActivityClientController.activityPaused(token)调用进来后开始的。在TaskFragment.resumeTopActivity()中,从mRootWindowContainer.ensureVisibilityAndConfig()进入到stop栈中。
注:上一个Activity(Home)的onStop()和下一个Activity(ActivityDemo)的onResume()的生命周期调度都是从同一个system端的Binder线程调用过来的。只不过stop过程中间有一次消息传递,所以执行速度比resume略慢,体现在日志上就是wm_on_stop_called日志通常在wm_on_resume_called日志之后打印。
(1) 堆栈
- 进程未启动的堆栈
IActivityClientController$Stub.onTransact() ->
ActivityClientController.activityPaused() ->
ActivityRecord.activityPaused() ->
TaskFragment.completePause() ->
RootWindowContainer.ensureActivitiesVisible() ->
RootWindowContainer.ensureActivitiesVisible() ->
DisplayContent.ensureActivitiesVisible() ->
WindowContainer.forAllRootTasks() ->
WindowContainer.forAllRootTasks() ->
WindowContainer.forAllRootTasks() ->
WindowContainer.forAllRootTasks() ->
WindowContainer.forAllRootTasks() ->
WindowContainer.forAllRootTasks() ->
WindowContainer.forAllRootTasks() ->
// Consumer接口调用过程,构造于DisplayContent.ensureActivitiesVisible()
Task.ensureActivitiesVisible() ->
Task.forAllLeafTasks() ->
Task.forAllLeafTasks() ->
// Consumer接口调用过程,构造于Task.ensureActivitiesVisible()
TaskFragment.updateActivityVisibilities() ->
EnsureActivitiesVisibleHelper.process() ->
EnsureActivitiesVisibleHelper.setActivityVisibilityState() ->
ActivityRecord.makeInvisible() ->
ActivityRecord.addToStopping() ->
ActivityTaskSupervisor.scheduleIdle()
- 进程已启动的堆栈
IActivityClientController$Stub.onTransact() ->
ActivityClientController.activityPaused() ->
ActivityRecord.activityPaused() ->
TaskFragment.completePause() ->
RootWindowContainer.resumeFocusedTasksTopActivities() ->
RootWindowContainer.resumeFocusedTasksTopActivities() ->
Task.resumeTopActivityUncheckedLocked() ->
Task.resumeTopActivityInnerLocked() ->
TaskFragment.resumeTopActivity() ->
ActivityTaskSupervisor.startSpecificActivity() ->
ActivityTaskSupervisor.realStartActivityLocked() ->
RootWindowContainer.ensureVisibilityAndConfig() ->
RootWindowContainer.ensureActivitiesVisible() ->
DisplayContent.ensureActivitiesVisible() ->
WindowContainer.forAllRootTasks() ->
WindowContainer.forAllRootTasks() ->
WindowContainer.forAllRootTasks() ->
WindowContainer.forAllRootTasks() ->
WindowContainer.forAllRootTasks() ->
WindowContainer.forAllRootTasks() ->
WindowContainer.forAllRootTasks() ->
Task.forAllRootTasks() ->
//...
Task.ensureActivitiesVisible() ->
Task.forAllLeafTasks() ->
//...
TaskFragment.updateActivityVisibilities() ->
EnsureActivitiesVisibleHelper.process() ->
EnsureActivitiesVisibleHelper.setActivityVisibilityState() ->
ActivityRecord.makeInvisible() ->
ActivityRecord.addToStopping() ->
ActivityTaskSupervisor.scheduleIdle()
然后执行到ActivityTaskSupervisor.scheduleIdle(),给system中的本线程发送了一个IDLE_NOW_MSG。
final void scheduleIdle() {
if (!mHandler.hasMessages(IDLE_NOW_MSG)) {
if (DEBUG_IDLE) Slog.d(TAG_IDLE, "scheduleIdle: Callers=" + Debug.getCallers(4));
mHandler.sendEmptyMessage(IDLE_NOW_MSG);
}
}
接收到IDLE_NOW_MSG消息之后,在ActivityRecord.stopIfPossible()中打印wm_stop_activity日志。
(2) ClientTransaction对象
this的内容如下:
- mActivityCallbacks = null;
- mLifecycleStateRequest为一个StopActivityItem对象,之后APP端通过该对象执行onStop();
- 之后还会通过StopActivityItem.postExecute() -> ActivityClient.activityStopped()调用回system端。
执行ClientTransaction
执行之前system的Stop流程调用过来的ClientTransaction事务。
这一次在TransactionExecutor.execute(transaction)中:
- 不会执行executeCallbacks(transaction),因为callbacks == null。
- 执行executeLifecycleState(transaction),取出StopActivityItem对象,调用到onStop()生命周期方法。
- 最后通过ActivityClient.activityStopped()调用回system端。
onStop()生命周期方法的调用过程:
TransactionExecutor.execute() ->
TransactionExecutor.executeLifecycleState() ->
ActivityTransactionItem.execute() ->
StopActivityItem.execute() ->
ActivityThread.handleStopActivity() ->
ActivityThread.performStopActivityInner() ->
ActivityThread.callActivityOnStop() ->
Activity.performStop() ->
Instrumentation.callActivityOnStop() ->
Launcher.onStop()
调用到system
(1) 创建StopInfo
TransactionExecutor.execute() ->
TransactionExecutor.executeLifecycleState() ->
ActivityTransactionItem.execute() ->
StopActivityItem.execute() ->
ActivityThread.handleStopActivity() ->
@Override
public void handleStopActivity(ActivityClientRecord r, int configChanges,
PendingTransactionActions pendingActions, boolean finalStateRequest, String reason) {
r.activity.mConfigChangeFlags |= configChanges;
final StopInfo stopInfo = new StopInfo();
performStopActivityInner(r, stopInfo, true /* saveState */, finalStateRequest,
reason);
if (localLOGV) Slog.v(
TAG, "Finishing stop of " + r + ": win=" + r.window);
updateVisibility(r, false);
// Make sure any pending writes are now committed.
if (!r.isPreHoneycomb()) {
QueuedWork.waitToFinish();
}
stopInfo.setActivity(r);
stopInfo.setState(r.state);
stopInfo.setPersistentState(r.persistentState);
pendingActions.setStopInfo(stopInfo);
mSomeActivitiesChanged = true;
}
(2) 发送StopInfo到Looper
TransactionExecutor.execute() ->
TransactionExecutor.executeLifecycleState() ->
StopActivityItem.postExecute() ->
ActivityThread.reportStop()
public void reportStop(PendingTransactionActions pendingActions) {
mH.post(pendingActions.getStopInfo());
}
(3) 执行StopInfo
最后APP在ActivityClient.activityStopped()中调用到system中执行ActivityClientController.activityStopped(),主要是通知system端Stop执行完成,不会再调用到APP端。
PendingTransactionActions.StopInfo.run() ->
ActivityClient.activityStopped()
关键过程
wm_stop_activity
说明:由接收IDLE_NOW_MSG消息开始,接收到IDLE_NOW_MSG消息之后,执行堆栈如下,在ActivityRecord.stopIfPossible()中打印wm_stop_activity日志。
ActivityTaskSupervisor$ActivityTaskSupervisorHandler.handleMessage() ->
ActivityTaskSupervisor$ActivityTaskSupervisorHandler.handleMessageInner() ->
ActivityTaskSupervisor$ActivityTaskSupervisorHandler.activityIdleFromMessage() ->
ActivityTaskSupervisor.activityIdleInternal() ->
ActivityTaskSupervisor.processStoppingAndFinishingActivities() ->
ActivityRecord.stopIfPossible()