Activity 启动流程log分析

为了方便跟踪启动过程中的相关流程,打开了如下开关以及添加了如下Log,

1、添加Log打印
1.1、2个setState()

其中ActivityRecord运行在system_server进程中,ActivityThread运行在App进程中,方法可以完整的反映整个Activity的变化过程,

// 在ActivityRecord.java文件中
void setState(ActivityState state, String reason) {
    if (DEBUG_STATES) Slog.v(TAG_STATES, "State movement: " + this + " from:" + getState()
                    + " to:" + state + " reason:" + reason,new Throwable());
             
// 在ActivityThread.java文件中
public void setState(@LifecycleState int newLifecycleState) {
        mLifecycleState = newLifecycleState;
        Slog.d(TAG,"setState newLifecycleState = " + newLifecycleState ,new Throwable());

小技巧:

在Log打印的后面,添加了new Throwable()方法,可以打印当前方法的整个调用链

1.2、Activity生命周期打印

把Activity里面的DEBUG_LIFECYCLE ,可以更直接的看到Activity生命周期的变化

// 在ActivityTaskManagerDebugConfig.java文件中
private static final boolean DEBUG_ALL_ACTIVITIES = DEBUG_ALL || false || true;
static final boolean DEBUG_STACK = DEBUG_ALL || false || true;
static final boolean DEBUG_TASKS = DEBUG_ALL || false || true;

// 在Activity.java文件中
private static final boolean DEBUG_LIFECYCLE = true;
1.3、ActivityRecrod/ActivityStack/TaskRecord的关联

/在TaskRecord.java里面

static TaskRecord create(ActivityTaskManagerService service, int taskId, ActivityInfo info,
            Intent intent, IVoiceInteractionSession voiceSession,
            IVoiceInteractor voiceInteractor) {
	    Slog.d(TAG,"new TaskRecord tasdkId = " + taskId ,new Throwable());
        return getTaskRecordFactory().create(
                service, taskId, info, intent, voiceSession, voiceInteractor);
}

static TaskRecord create(ActivityTaskManagerService service, int taskId, ActivityInfo info,
            Intent intent, TaskDescription taskDescription) {
        Slog.d(TAG,"new TaskRecord tasdkId = " + taskId ,new Throwable());
        return getTaskRecordFactory().create(service, taskId, info, intent, taskDescription);
}

// 设置ActivityRecord 和TaskRecord的关系
private void addOrReparentStartingActivity(TaskRecord parent, String reason) {
    Slog.d(TAG,"addOrReparentStartingActivity",new Throwable());  

在ActivityStack.java里面

ActivityStack(ActivityDisplay display, int stackId, ActivityStackSupervisor supervisor,
            int windowingMode, int activityType, boolean onTop) {
	    Slog.d(TAG,"new ActivityStack stackid = " + stackId,new Throwable());
}
2、Log分析
2.1、ActivityRecord的创建

从桌面点击DeskClock 图标,会有如下打印

08-23 17:30:21.258  1314  4528 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.android.deskclock/.DeskClock bnds=[35,503][237,780]} from uid 10081

对应的ActivityStarter.startActivity方法

    private int startActivity(...//省略参数) {
        mSupervisor.getActivityMetricsLogger().notifyActivityLaunching(intent);
        int err = ActivityManager.START_SUCCESS;
        ....
        if (err == ActivityManager.START_SUCCESS) {
            Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true, true, false)
                    + "} from uid " + callingUid);
        }
  }

在startActivity的方法中,会创建一个ActivityRecord对象,并将初始化状态设置为INITIALIZING

    private int startActivity(...//省略参数) {
        mSupervisor.getActivityMetricsLogger().notifyActivityLaunching(intent);
        int err = ActivityManager.START_SUCCESS;
        .... //省略中间代码
        if (err == ActivityManager.START_SUCCESS) {
            Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true, true, false)
                    + "} from uid " + callingUid);
        }
        .... //省略中间代码
        ActivityRecord r = new ActivityRecord(mService, callerApp, callingPid, callingUid,
                callingPackage, intent, resolvedType, aInfo, mService.getGlobalConfiguration(),
                resultRecord, resultWho, requestCode, componentSpecified, voiceSession != null,
                mSupervisor, checkedOptions, sourceRecord);
  }
08-23 17:30:21.258  1314  4528 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.android.deskclock/.DeskClock bnds=[35,503][237,780]} from uid 10081
08-23 17:30:21.261  1314  4528 V ActivityTaskManager: State movement: ActivityRecord{ed5f802 u0 com.android.deskclock/.DeskClock t-1} from:null to:INITIALIZING reason:ActivityRecord ctor
08-23 17:30:21.261  1314  4528 V ActivityTaskManager: java.lang.Throwable
08-23 17:30:21.261  1314  4528 V ActivityTaskManager: 	at com.android.server.wm.ActivityRecord.setState(ActivityRecord.java:1857)
08-23 17:30:21.261  1314  4528 V ActivityTaskManager: 	at com.android.server.wm.ActivityRecord.<init>(ActivityRecord.java:964)
08-23 17:30:21.261  1314  4528 V ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:902)
08-23 17:30:21.261  1314  4528 V ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:585)
08-23 17:30:21.261  1314  4528 V ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.startActivityMayWait(ActivityStarter.java:1298)
08-23 17:30:21.261  1314  4528 V ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:516)
08-23 17:30:21.261  1314  4528 V ActivityTaskManager: 	at com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1061)
08-23 17:30:21.261  1314  4528 V ActivityTaskManager: 	at com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1035)
08-23 17:30:21.261  1314  4528 V ActivityTaskManager: 	at com.android.server.wm.ActivityTaskManagerService.startActivity(ActivityTaskManagerService.java:1012)
08-23 17:30:21.261  1314  4528 V ActivityTaskManager: 	at android.app.IActivityTaskManager$Stub.onTransact(IActivityTaskManager.java:1486)
08-23 17:30:21.261  1314  4528 V ActivityTaskManager: 	at android.os.Binder.execTransactInternal(Binder.java:1021)
08-23 17:30:21.261  1314  4528 V ActivityTaskManager: 	at android.os.Binder.execTransact(Binder.java:994)

ActivityRecord的构造方法如下

    ActivityRecord() {
        mAtmService = _service;
        mRootActivityContainer = _service.mRootActivityContainer;
        appToken = new Token(this, _intent);
        setState(INITIALIZING, "ActivityRecord ctor");
    }
2.2、ActivityStack的创建

由于是首次启动应用,没有可以复用的task,需要创建对应的ActivityStack对象

08-23 17:30:21.282  1314  4528 D ActivityTaskManager: Looking for task of ActivityRecord{ed5f802 u0 com.android.deskclock/.DeskClock t-1}
08-23 17:30:21.283  1314  4528 D ActivityTaskManager: Looking for task of ActivityRecord{ed5f802 u0 com.android.deskclock/.DeskClock t-1} in ActivityStack{1502de5 stackId=0 type=home mode=fullscreen visible=true translucent=false, 1 tasks}
08-23 17:30:21.283  1314  4528 D ActivityTaskManager: Comparing existing cls=com.android.launcher3/.Launcher/aff=null to new cls=com.android.deskclock/.DeskClock/aff=com.android.deskclock
08-23 17:30:21.283  1314  4528 D ActivityTaskManager: Not a match: TaskRecord{6dee666 #83 ?? U=0 StackId=0 sz=1}
08-23 17:30:21.283  1314  4528 D ActivityTaskManager: No task found
08-23 17:30:21.285  1314  4528 D ActivityTaskManager: new ActivityStack stackid = 4
08-23 17:30:21.285  1314  4528 D ActivityTaskManager: java.lang.Throwable
08-23 17:30:21.285  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityStack.<init>(ActivityStack.java:511)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityDisplay.createStackUnchecked(ActivityDisplay.java:465)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityDisplay.createStack(ActivityDisplay.java:455)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityDisplay.getOrCreateStack(ActivityDisplay.java:383)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityDisplay.getOrCreateStack(ActivityDisplay.java:401)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.RootActivityContainer.getLaunchStack(RootActivityContainer.java:1737)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.getLaunchStack(ActivityStarter.java:2704)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.computeStackFocus(ActivityStarter.java:2612)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.setTaskFromReuseOrCreateNewTask(ActivityStarter.java:2323)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1688)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:1404)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:935)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:585)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.startActivityMayWait(ActivityStarter.java:1298)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:516)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1061)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1035)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityTaskManagerService.startActivity(ActivityTaskManagerService.java:1012)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager: 	at android.app.IActivityTaskManager$Stub.onTransact(IActivityTaskManager.java:1486)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager: 	at android.os.Binder.execTransactInternal(Binder.java:1021)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager: 	at android.os.Binder.execTransact(Binder.java:994)

在ActivityStack的构造方法中,会调用ActivityDisplay的addChild方法,将ActivityDisplay与ActivityStack关联起来

display.addChild(this, onTop ? POSITION_TOP : POSITION_BOTTOM);

对应有如下的打印

08-23 17:30:21.290  1314  4528 V ActivityTaskManager: addChild: attaching ActivityStack{f67f949 stackId=4 type=standard mode=fullscreen visible=false translucent=true, 0 tasks} to displayId=0 position=1
2.3 TaskRecord创建

创建TaskRecord对象的调用链如下:

08-23 17:30:21.292  1314  4528 D ActivityTaskManager: new TaskRecord tasdkId = 87
08-23 17:30:21.292  1314  4528 D ActivityTaskManager: java.lang.Throwable
08-23 17:30:21.292  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.TaskRecord.create(TaskRecord.java:2704)
08-23 17:30:21.292  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityStack.createTaskRecord(ActivityStack.java:5515)
08-23 17:30:21.292  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.setTaskFromReuseOrCreateNewTask(ActivityStarter.java:2330)
08-23 17:30:21.292  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1688)
08-23 17:30:21.292  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:1404)
08-23 17:30:21.292  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:935)
08-23 17:30:21.292  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:585)
08-23 17:30:21.292  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.startActivityMayWait(ActivityStarter.java:1298)
08-23 17:30:21.292  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:516)
08-23 17:30:21.292  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1061)
08-23 17:30:21.292  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1035)
08-23 17:30:21.292  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityTaskManagerService.startActivity(ActivityTaskManagerService.java:1012)
08-23 17:30:21.292  1314  4528 D ActivityTaskManager: 	at android.app.IActivityTaskManager$Stub.onTransact(IActivityTaskManager.java:1486)
08-23 17:30:21.292  1314  4528 D ActivityTaskManager: 	at android.os.Binder.execTransactInternal(Binder.java:1021)
08-23 17:30:21.292  1314  4528 D ActivityTaskManager: 	at android.os.Binder.execTransact(Binder.java:994)

在ActivityStack.createTaskRecord方法里面,调用addTask将TaskRecord和ActivityStack关联起来

    TaskRecord createTaskRecord(int taskId, ActivityInfo info, Intent intent,
            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
            boolean toTop, ActivityRecord activity, ActivityRecord source,
            ActivityOptions options) {
        final TaskRecord task = TaskRecord.create(
                mService, taskId, info, intent, voiceSession, voiceInteractor);
        // add the task to stack first, mTaskPositioner might need the stack association
        addTask(task, toTop, "createTaskRecord");
        final int displayId = mDisplayId != INVALID_DISPLAY ? mDisplayId : DEFAULT_DISPLAY;
        final boolean isLockscreenShown = mService.mStackSupervisor.getKeyguardController()
                .isKeyguardOrAodShowing(displayId);
        if (!mStackSupervisor.getLaunchParamsController()
                .layoutTask(task, info.windowLayout, activity, source, options)
                && !matchParentBounds() && task.isResizeable() && !isLockscreenShown) {
            task.updateOverrideConfiguration(getRequestedOverrideBounds());
        }
        task.createTask(toTop, (info.flags & FLAG_SHOW_FOR_ALL_USERS) != 0);
        return task;
    }

在创建TaskRecord之后,调用addOrReparentStartingActivity方法来设置ActivityRecord和TaskRecord在关联关系

08-23 17:30:21.296  1314  4528 D ActivityTaskManager: addOrReparentStartingActivity
08-23 17:30:21.296  1314  4528 D ActivityTaskManager: java.lang.Throwable
08-23 17:30:21.296  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.addOrReparentStartingActivity(ActivityStarter.java:2574)
08-23 17:30:21.296  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.setTaskFromReuseOrCreateNewTask(ActivityStarter.java:2335)
08-23 17:30:21.296  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1688)
08-23 17:30:21.296  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:1404)
08-23 17:30:21.296  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:935)
08-23 17:30:21.296  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:585)
08-23 17:30:21.296  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.startActivityMayWait(ActivityStarter.java:1298)
08-23 17:30:21.296  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:516)
08-23 17:30:21.296  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1061)
08-23 17:30:21.296  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1035)
08-23 17:30:21.296  1314  4528 D ActivityTaskManager: 	at com.android.server.wm.ActivityTaskManagerService.startActivity(ActivityTaskManagerService.java:1012)
08-23 17:30:21.296  1314  4528 D ActivityTaskManager: 	at android.app.IActivityTaskManager$Stub.onTransact(IActivityTaskManager.java:1486)
08-23 17:30:21.296  1314  4528 D ActivityTaskManager: 	at android.os.Binder.execTransactInternal(Binder.java:1021)
08-23 17:30:21.296  1314  4528 D ActivityTaskManager: 	at android.os.Binder.execTransact(Binder.java:994)

addOrReparentStartingActivity方法实现如下:

private void addOrReparentStartingActivity(TaskRecord parent, String reason) {
        Slog.d(TAG,"addOrReparentStartingActivity",new Throwable());
        if (mStartActivity.getTaskRecord() == null || mStartActivity.getTaskRecord() == parent) {
            parent.addActivityToTop(mStartActivity);
        } else {
            mStartActivity.reparent(parent, parent.mActivities.size() /* top */, reason);
        }
    }
2.4、Activity生命周期变化

Home应用状态从RESUMED到PAUSING

08-23 17:30:21.306  1314  4528 D ActivityTaskManager: pauseBackStacks: stack=ActivityStack{1502de5 stackId=0 type=home mode=fullscreen visible=true translucent=false, 1 tasks} mResumedActivity=ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83}
08-23 17:30:21.306  1314  4528 V ActivityTaskManager: Moving to PAUSING: ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83}
08-23 17:30:21.306  1314  4528 V ActivityTaskManager: State movement: ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83} from:RESUMED to:PAUSING reason:startPausingLocked
08-23 17:30:21.306  1314  4528 V ActivityTaskManager: java.lang.Throwable
08-23 17:30:21.306  1314  4528 V ActivityTaskManager: 	at com.android.server.wm.ActivityRecord.setState(ActivityRecord.java:1857)
08-23 17:30:21.306  1314  4528 V ActivityTaskManager: 	at com.android.server.wm.ActivityStack.startPausingLocked(ActivityStack.java:1690)
08-23 17:30:21.306  1314  4528 V ActivityTaskManager: 	at com.android.server.wm.ActivityDisplay.pauseBackStacks(ActivityDisplay.java:590)
08-23 17:30:21.306  1314  4528 V ActivityTaskManager: 	at com.android.server.wm.ActivityStack.resumeTopActivityInnerLocked(ActivityStack.java:2747)
08-23 17:30:21.306  1314  4528 V ActivityTaskManager: 	at com.android.server.wm.ActivityStack.resumeTopActivityUncheckedLocked(ActivityStack.java:2578)
08-23 17:30:21.306  1314  4528 V ActivityTaskManager: 	at com.android.server.wm.RootActivityContainer.resumeFocusedStacksTopActivities(RootActivityContainer.java:1159)
08-23 17:30:21.306  1314  4528 V ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1746)
08-23 17:30:21.306  1314  4528 V ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:1404)
08-23 17:30:21.306  1314  4528 V ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:935)
08-23 17:30:21.306  1314  4528 V ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:585)
08-23 17:30:21.306  1314  4528 V ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.startActivityMayWait(ActivityStarter.java:1298)
08-23 17:30:21.306  1314  4528 V ActivityTaskManager: 	at com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:516)
08-23 17:30:21.306  1314  4528 V ActivityTaskManager: 	at com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1061)
08-23 17:30:21.306  1314  4528 V ActivityTaskManager: 	at com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1035)
08-23 17:30:21.306  1314  4528 V ActivityTaskManager: 	at com.android.server.wm.ActivityTaskManagerService.startActivity(ActivityTaskManagerService.java:1012)
08-23 17:30:21.306  1314  4528 V ActivityTaskManager: 	at android.app.IActivityTaskManager$Stub.onTransact(IActivityTaskManager.java:1486)
08-23 17:30:21.306  1314  4528 V ActivityTaskManager: 	at android.os.Binder.execTransactInternal(Binder.java:1021)
08-23 17:30:21.306  1314  4528 V ActivityTaskManager: 	at android.os.Binder.execTransact(Binder.java:994)

在startPausingLocked方法里面,会调用到PauseActivityItem

mService.getLifecycleManager().scheduleTransaction(prev.app.getThread(),
                        prev.appToken, PauseActivityItem.obtain(prev.finishing, userLeaving,
                                prev.configChangeFlags, pauseImmediately));

然后会调用到Activity.onPause方法,打印Activity: onPause

08-22 18:41:32.897  2055  2055 V Activity: onPause com.android.launcher3.Launcher@cfe111f
08-22 18:41:32.898  2055  2055 D ActivityThread: setState newLifecycleState = 4
08-22 18:41:32.898  2055  2055 D ActivityThread: java.lang.Throwable
08-22 18:41:32.898  2055  2055 D ActivityThread: 	at android.app.ActivityThread$ActivityClientRecord.setState(ActivityThread.java:586)
08-22 18:41:32.898  2055  2055 D ActivityThread: 	at android.app.ActivityThread.performPauseActivityIfNeeded(ActivityThread.java:4507)
08-22 18:41:32.898  2055  2055 D ActivityThread: 	at android.app.ActivityThread.performPauseActivity(ActivityThread.java:4455)
08-22 18:41:32.898  2055  2055 D ActivityThread: 	at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:4407)
08-22 18:41:32.898  2055  2055 D ActivityThread: 	at android.app.servertransaction.PauseActivityItem.execute(PauseActivityItem.java:46)
08-22 18:41:32.898  2055  2055 D ActivityThread: 	at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
08-22 18:41:32.898  2055  2055 D ActivityThread: 	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
08-22 18:41:32.898  2055  2055 D ActivityThread: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2017)
08-22 18:41:32.898  2055  2055 D ActivityThread: 	at android.os.Handler.dispatchMessage(Handler.java:107)
08-22 18:41:32.898  2055  2055 D ActivityThread: 	at android.os.Looper.loop(Looper.java:214)
08-22 18:41:32.898  2055  2055 D ActivityThread: 	at android.app.ActivityThread.main(ActivityThread.java:7357)
08-22 18:41:32.898  2055  2055 D ActivityThread: 	at java.lang.reflect.Method.invoke(Native Method)
08-22 18:41:32.898  2055  2055 D ActivityThread: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
08-22 18:41:32.898  2055  2055 D ActivityThread: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

Home应用状态从PAUSING到PAUSED

08-23 17:30:21.323  1314  1443 V ActivityTaskManager: Moving to PAUSED: ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83} (pause complete)
08-23 17:30:21.324  1314  1443 V ActivityTaskManager: State movement: ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83} from:PAUSING to:PAUSED reason:completePausedLocked
08-23 17:30:21.324  1314  1443 V ActivityTaskManager: java.lang.Throwable
08-23 17:30:21.324  1314  1443 V ActivityTaskManager: 	at com.android.server.wm.ActivityRecord.setState(ActivityRecord.java:1857)
08-23 17:30:21.324  1314  1443 V ActivityTaskManager: 	at com.android.server.wm.ActivityStack.completePauseLocked(ActivityStack.java:1801)
08-23 17:30:21.324  1314  1443 V ActivityTaskManager: 	at com.android.server.wm.ActivityStack.activityPausedLocked(ActivityStack.java:1770)
08-23 17:30:21.324  1314  1443 V ActivityTaskManager: 	at com.android.server.wm.ActivityTaskManagerService.activityPaused(ActivityTaskManagerService.java:1714)
08-23 17:30:21.324  1314  1443 V ActivityTaskManager: 	at android.app.IActivityTaskManager$Stub.onTransact(IActivityTaskManager.java:1981)
08-23 17:30:21.324  1314  1443 V ActivityTaskManager: 	at android.os.Binder.execTransactInternal(Binder.java:1021)
08-23 17:30:21.324  1314  1443 V ActivityTaskManager: 	at android.os.Binder.execTransact(Binder.java:994)

注意:之前的这些流程都是运行在system_server里面,此时DeskClock应用进程还没有创建

Deskclock应用进程创建,pid是4887

08-23 17:30:21.356   642   642 D Zygote  : Forked child process 4887
08-23 17:30:21.359  1314  1362 I ActivityManager: Start proc 4887:com.android.deskclock/u0a93 for activity {com.android.deskclock/com.android.deskclock.DeskClock}

deskclock应用状态从INIT变成RESUMED

08-23 17:30:21.397  1314  1443 V ActivityTaskManager: Moving to RESUMED: ActivityRecord{ed5f802 u0 com.android.deskclock/.DeskClock t87} (starting new instance) callers=com.android.server.wm.ActivityStackSupervisor.realStartActivityLocked:917 com.android.server.wm.RootActivityContainer.attachApplication:784 com.android.server.wm.ActivityTaskManagerService$LocalService.attachApplication:6908 com.android.server.am.ActivityManagerService.attachApplicationLocked:5104 com.android.server.am.ActivityManagerService.attachApplication:5184 
08-23 17:30:21.398  1314  1443 V ActivityTaskManager: State movement: ActivityRecord{ed5f802 u0 com.android.deskclock/.DeskClock t87} from:INITIALIZING to:RESUMED reason:minimalResumeActivityLocked
08-23 17:30:21.398  1314  1443 V ActivityTaskManager: java.lang.Throwable
08-23 17:30:21.398  1314  1443 V ActivityTaskManager: 	at com.android.server.wm.ActivityRecord.setState(ActivityRecord.java:1857)
08-23 17:30:21.398  1314  1443 V ActivityTaskManager: 	at com.android.server.wm.ActivityStack.minimalResumeActivityLocked(ActivityStack.java:1500)
08-23 17:30:21.398  1314  1443 V ActivityTaskManager: 	at com.android.server.wm.ActivityStackSupervisor.realStartActivityLocked(ActivityStackSupervisor.java:917)
08-23 17:30:21.398  1314  1443 V ActivityTaskManager: 	at com.android.server.wm.RootActivityContainer.attachApplication(RootActivityContainer.java:784)
08-23 17:30:21.398  1314  1443 V ActivityTaskManager: 	at com.android.server.wm.ActivityTaskManagerService$LocalService.attachApplication(ActivityTaskManagerService.java:6908)
08-23 17:30:21.398  1314  1443 V ActivityTaskManager: 	at com.android.server.am.ActivityManagerService.attachApplicationLocked(ActivityManagerService.java:5104)
08-23 17:30:21.398  1314  1443 V ActivityTaskManager: 	at com.android.server.am.ActivityManagerService.attachApplication(ActivityManagerService.java:5184)
08-23 17:30:21.398  1314  1443 V ActivityTaskManager: 	at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:2003)
08-23 17:30:21.398  1314  1443 V ActivityTaskManager: 	at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2741)
08-23 17:30:21.398  1314  1443 V ActivityTaskManager: 	at android.os.Binder.execTransactInternal(Binder.java:1021)
08-23 17:30:21.398  1314  1443 V ActivityTaskManager: 	at android.os.Binder.execTransact(Binder.java:994)

在ActivityStackSupervisor.realStartActivityLocked方法里面

boolean realStartActivityLocked(ActivityRecord r, WindowProcessController proc,
            boolean andResume, boolean checkConfig) throws RemoteException {
        try {
		    // 设置Activity和process关系
            r.setProcess(proc);

            try {
                // Create activity launch transaction.
                final ClientTransaction clientTransaction = ClientTransaction.obtain(
                        proc.getThread(), r.appToken);

                final DisplayContent dc = r.getDisplay().mDisplayContent;
				// 初始状态是LaunchActivityItem,在ActivityThread.performLaunchActivity 里面,已经将ActivityRecord的状态设置为r.setState(ON_CREATE);
                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.launchedFromPackage, task.voiceInteractor, proc.getReportedProcState(),
                        r.icicle, r.persistentState, results, newIntents,
                        dc.isNextTransitionForward(), proc.createProfilerInfoIfNeeded(),
                                r.assistToken));

                // Set desired final state.
                final ActivityLifecycleItem lifecycleItem;
                if (andResume) {
					// 此处andResume是true,目标状态是ResumeActivityItem
                    lifecycleItem = ResumeActivityItem.obtain(dc.isNextTransitionForward());
                } else {
                    lifecycleItem = PauseActivityItem.obtain();
                }
                clientTransaction.setLifecycleStateRequest(lifecycleItem);

                // Schedule transaction.
                mService.getLifecycleManager().scheduleTransaction(clientTransaction);
			}
		}
}

通过LifecycleManager,从ON_CREATE到ON_RESUME,
executeLifecycleState ==> cycleToPath ==> performLifecycleSequence

    private void cycleToPath(ActivityClientRecord r, int finish, boolean excludeLastState,
            ClientTransaction transaction) {
        final int start = r.getLifecycleState(); // 此处是ON_CREATE
        if (DEBUG_RESOLVER) {
            Slog.d(TAG, tId(transaction) + "Cycle activity: "
                    + getShortActivityName(r.token, mTransactionHandler)
                    + " from: " + getStateName(start) + " to: " + getStateName(finish)
                    + " excludeLastState: " + excludeLastState);
        }
        // start是ON_CREATE, finish 是ON_RESUME,在IntArray 里面会依次添加ON_CREATE、ON_START、ON_RESUME
        final IntArray path = mHelper.getLifecyclePath(start, finish, excludeLastState);
        performLifecycleSequence(r, path, transaction);
    }

在cycleToPath里面添加的调用状态,在performLifecycleSequence里面依次执行

    /** Transition the client through previously initialized state sequence. */
    private void performLifecycleSequence(ActivityClientRecord r, IntArray path,
            ClientTransaction transaction) {
        final int size = path.size();
        for (int i = 0, state; i < size; i++) {
            state = path.get(i);
            if (DEBUG_RESOLVER) {
                Slog.d(TAG, tId(transaction) + "Transitioning activity: "
                        + getShortActivityName(r.token, mTransactionHandler)
                        + " to state: " + getStateName(state));
            }
            switch (state) {
                case ON_CREATE:
                    mTransactionHandler.handleLaunchActivity(r, mPendingActions,
                            null /* customIntent */);
                    break;
                case ON_START:
                    mTransactionHandler.handleStartActivity(r, mPendingActions);
                    break;
                case ON_RESUME:
                    mTransactionHandler.handleResumeActivity(r.token, false /* finalStateRequest */,
                            r.isForward, "LIFECYCLER_RESUME_ACTIVITY");
                    break;
           }
 }

对应的log打印:

// 调用Activity的onCreate
08-23 17:30:21.706  4887  4887 V Activity: onCreate com.android.deskclock.DeskClock@5f58495: null
08-23 17:30:22.006  4887  4887 D ActivityThread: setState newLifecycleState = 1
08-23 17:30:22.006  4887  4887 D ActivityThread: java.lang.Throwable
08-23 17:30:22.006  4887  4887 D ActivityThread: 	at android.app.ActivityThread$ActivityClientRecord.setState(ActivityThread.java:586)
08-23 17:30:22.006  4887  4887 D ActivityThread: 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3255)
08-23 17:30:22.006  4887  4887 D ActivityThread: 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3410)
08-23 17:30:22.006  4887  4887 D ActivityThread: 	at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
08-23 17:30:22.006  4887  4887 D ActivityThread: 	at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
08-23 17:30:22.006  4887  4887 D ActivityThread: 	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
08-23 17:30:22.006  4887  4887 D ActivityThread: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2017)
08-23 17:30:22.006  4887  4887 D ActivityThread: 	at android.os.Handler.dispatchMessage(Handler.java:107)
08-23 17:30:22.006  4887  4887 D ActivityThread: 	at android.os.Looper.loop(Looper.java:214)
08-23 17:30:22.006  4887  4887 D ActivityThread: 	at android.app.ActivityThread.main(ActivityThread.java:7357)
08-23 17:30:22.006  4887  4887 D ActivityThread: 	at java.lang.reflect.Method.invoke(Native Method)
08-23 17:30:22.006  4887  4887 D ActivityThread: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
08-23 17:30:22.006  4887  4887 D ActivityThread: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
// 调用Activity的onStart
08-23 17:30:22.009  4887  4887 V Activity: onStart com.android.deskclock.DeskClock@5f58495
08-23 17:30:22.016  4887  4887 D ActivityThread: setState newLifecycleState = 2
08-23 17:30:22.016  4887  4887 D ActivityThread: java.lang.Throwable
08-23 17:30:22.016  4887  4887 D ActivityThread: 	at android.app.ActivityThread$ActivityClientRecord.setState(ActivityThread.java:586)
08-23 17:30:22.016  4887  4887 D ActivityThread: 	at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3296)
08-23 17:30:22.016  4887  4887 D ActivityThread: 	at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
08-23 17:30:22.016  4887  4887 D ActivityThread: 	at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
08-23 17:30:22.016  4887  4887 D ActivityThread: 	at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
08-23 17:30:22.016  4887  4887 D ActivityThread: 	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
08-23 17:30:22.016  4887  4887 D ActivityThread: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2017)
08-23 17:30:22.016  4887  4887 D ActivityThread: 	at android.os.Handler.dispatchMessage(Handler.java:107)
08-23 17:30:22.016  4887  4887 D ActivityThread: 	at android.os.Looper.loop(Looper.java:214)
08-23 17:30:22.016  4887  4887 D ActivityThread: 	at android.app.ActivityThread.main(ActivityThread.java:7357)
08-23 17:30:22.016  4887  4887 D ActivityThread: 	at java.lang.reflect.Method.invoke(Native Method)
08-23 17:30:22.016  4887  4887 D ActivityThread: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
08-23 17:30:22.016  4887  4887 D ActivityThread: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
// 调用Activity的onResume
08-23 17:30:22.016  4887  4887 V Activity: onResume com.android.deskclock.DeskClock@5f58495
08-23 17:30:22.035  4887  4887 D ActivityThread: setState newLifecycleState = 3
08-23 17:30:22.035  4887  4887 D ActivityThread: java.lang.Throwable
08-23 17:30:22.035  4887  4887 D ActivityThread: 	at android.app.ActivityThread$ActivityClientRecord.setState(ActivityThread.java:586)
08-23 17:30:22.035  4887  4887 D ActivityThread: 	at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4200)
08-23 17:30:22.035  4887  4887 D ActivityThread: 	at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4238)
08-23 17:30:22.035  4887  4887 D ActivityThread: 	at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52)
08-23 17:30:22.035  4887  4887 D ActivityThread: 	at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
08-23 17:30:22.035  4887  4887 D ActivityThread: 	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
08-23 17:30:22.035  4887  4887 D ActivityThread: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2017)
08-23 17:30:22.035  4887  4887 D ActivityThread: 	at android.os.Handler.dispatchMessage(Handler.java:107)
08-23 17:30:22.035  4887  4887 D ActivityThread: 	at android.os.Looper.loop(Looper.java:214)
08-23 17:30:22.035  4887  4887 D ActivityThread: 	at android.app.ActivityThread.main(ActivityThread.java:7357)
08-23 17:30:22.035  4887  4887 D ActivityThread: 	at java.lang.reflect.Method.invoke(Native Method)
08-23 17:30:22.035  4887  4887 D ActivityThread: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
08-23 17:30:22.035  4887  4887 D ActivityThread: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

Home 状态从PAUSED到STOPPING

08-23 17:30:22.955  1314  1443 V ActivityTaskManager: State movement: ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83} from:PAUSED to:STOPPING reason:stopActivityLocked
08-23 17:30:22.955  1314  1443 V ActivityTaskManager: java.lang.Throwable
08-23 17:30:22.955  1314  1443 V ActivityTaskManager: 	at com.android.server.wm.ActivityRecord.setState(ActivityRecord.java:1857)
08-23 17:30:22.955  1314  1443 V ActivityTaskManager: 	at com.android.server.wm.ActivityStack.stopActivityLocked(ActivityStack.java:3776)
08-23 17:30:22.955  1314  1443 V ActivityTaskManager: 	at com.android.server.wm.ActivityStackSupervisor.activityIdleInternalLocked(ActivityStackSupervisor.java:1357)
08-23 17:30:22.955  1314  1443 V ActivityTaskManager: 	at com.android.server.wm.ActivityTaskManagerService.activityIdle(ActivityTaskManagerService.java:1675)
08-23 17:30:22.955  1314  1443 V ActivityTaskManager: 	at android.app.IActivityTaskManager$Stub.onTransact(IActivityTaskManager.java:1957)
08-23 17:30:22.955  1314  1443 V ActivityTaskManager: 	at android.os.Binder.execTransactInternal(Binder.java:1021)
08-23 17:30:22.955  1314  1443 V ActivityTaskManager: 	at android.os.Binder.execTransact(Binder.java:994)

Home状态变成onStop,在ActivityStack.stopActivityLocked方法里面,会调用StopActivityItem来执行Activity的onStop方法

 mService.getLifecycleManager().scheduleTransaction(r.app.getThread(), r.appToken,
        StopActivityItem.obtain(r.visible, r.configChangeFlags));

对应的Log打印:

08-23 17:30:22.957  2055  2055 V Activity: onStop com.android.launcher3.Launcher@cfe111f
08-23 17:30:22.958  1314  1355 D ActivityManager: Proc state change of com.android.launcher3 to BFGS (6): service
08-23 17:30:22.958  2055  2055 V Activity: onTrimMemory com.android.launcher3.Launcher@cfe111f: 20
08-23 17:30:22.959  2055  2055 D ActivityThread: setState newLifecycleState = 5
08-23 17:30:22.959  2055  2055 D ActivityThread: java.lang.Throwable
08-23 17:30:22.959  2055  2055 D ActivityThread: 	at android.app.ActivityThread$ActivityClientRecord.setState(ActivityThread.java:586)
08-23 17:30:22.959  2055  2055 D ActivityThread: 	at android.app.ActivityThread.callActivityOnStop(ActivityThread.java:4628)
08-23 17:30:22.959  2055  2055 D ActivityThread: 	at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:4595)
08-23 17:30:22.959  2055  2055 D ActivityThread: 	at android.app.ActivityThread.handleStopActivity(ActivityThread.java:4670)
08-23 17:30:22.959  2055  2055 D ActivityThread: 	at android.app.servertransaction.StopActivityItem.execute(StopActivityItem.java:41)
08-23 17:30:22.959  2055  2055 D ActivityThread: 	at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
08-23 17:30:22.959  2055  2055 D ActivityThread: 	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
08-23 17:30:22.959  2055  2055 D ActivityThread: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2017)
08-23 17:30:22.959  2055  2055 D ActivityThread: 	at android.os.Handler.dispatchMessage(Handler.java:107)
08-23 17:30:22.959  2055  2055 D ActivityThread: 	at android.os.Looper.loop(Looper.java:214)
08-23 17:30:22.959  2055  2055 D ActivityThread: 	at android.app.ActivityThread.main(ActivityThread.java:7357)
08-23 17:30:22.959  2055  2055 D ActivityThread: 	at java.lang.reflect.Method.invoke(Native Method)
08-23 17:30:22.959  2055  2055 D ActivityThread: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
08-23 17:30:22.959  2055  2055 D ActivityThread: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

Home的ActivityRecord状态变成STOPPED

08-23 17:30:22.980  1314  2324 V ActivityTaskManager: State movement: ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83} from:STOPPING to:STOPPED reason:activityStoppedLocked
08-23 17:30:22.980  1314  2324 V ActivityTaskManager: java.lang.Throwable
08-23 17:30:22.980  1314  2324 V ActivityTaskManager: 	at com.android.server.wm.ActivityRecord.setState(ActivityRecord.java:1857)
08-23 17:30:22.980  1314  2324 V ActivityTaskManager: 	at com.android.server.wm.ActivityRecord.activityStoppedLocked(ActivityRecord.java:2278)
08-23 17:30:22.980  1314  2324 V ActivityTaskManager: 	at com.android.server.wm.ActivityTaskManagerService.activityStopped(ActivityTaskManagerService.java:1745)
08-23 17:30:22.980  1314  2324 V ActivityTaskManager: 	at android.app.IActivityTaskManager$Stub.onTransact(IActivityTaskManager.java:2011)
08-23 17:30:22.980  1314  2324 V ActivityTaskManager: 	at android.os.Binder.execTransactInternal(Binder.java:1021)
08-23 17:30:22.980  1314  2324 V ActivityTaskManager: 	at android.os.Binder.execTransact(Binder.java:994)

重点说明:

1.在整个Log过程,涉及到3个应用进程,home/system_server/deskclock
2.Activity生命周期的打印是在应用进程里面,ActivityRecord的状态变化是在system_server进程里面
3.Activity和ActivityRecord的状态变化是穿插的

Activity的角度看整个生命周期变化如下:

08-23 17:30:21.322  2055  2055 V Activity: onPause com.android.launcher3.Launcher@cfe111f
08-23 17:30:21.706  4887  4887 V Activity: onCreate com.android.deskclock.DeskClock@5f58495: null
08-23 17:30:22.009  4887  4887 V Activity: onStart com.android.deskclock.DeskClock@5f58495
08-23 17:30:22.016  4887  4887 V Activity: onResume com.android.deskclock.DeskClock@5f58495
08-23 17:30:22.957  2055  2055 V Activity: onStop com.android.launcher3.Launcher@cfe111f

从ActivityRecord的角度看整个状态变化如下:

08-23 17:30:21.261  1314  4528 V ActivityTaskManager: State movement: ActivityRecord{ed5f802 u0 com.android.deskclock/.DeskClock t-1} from:null to:INITIALIZING reason:ActivityRecord ctor
08-23 17:30:21.306  1314  4528 V ActivityTaskManager: State movement: ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83} from:RESUMED to:PAUSING reason:startPausingLocked
08-23 17:30:21.324  1314  1443 V ActivityTaskManager: State movement: ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83} from:PAUSING to:PAUSED reason:completePausedLocked
08-23 17:30:21.398  1314  1443 V ActivityTaskManager: State movement: ActivityRecord{ed5f802 u0 com.android.deskclock/.DeskClock t87} from:INITIALIZING to:RESUMED reason:minimalResumeActivityLocked
08-23 17:30:22.955  1314  1443 V ActivityTaskManager: State movement: ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83} from:PAUSED to:STOPPING reason:stopActivityLocked
08-23 17:30:22.980  1314  2324 V ActivityTaskManager: State movement: ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83} from:STOPPING to:STOPPED reason:activityStoppedLocked

二者之前状态穿插变化

08-23 17:30:21.261  1314  4528 V ActivityTaskManager: State movement: ActivityRecord{ed5f802 u0 com.android.deskclock/.DeskClock t-1} from:null to:INITIALIZING reason:ActivityRecord ctor
08-23 17:30:21.306  1314  4528 V ActivityTaskManager: State movement: ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83} from:RESUMED to:PAUSING reason:startPausingLocked
08-23 17:30:21.322  2055  2055 V Activity: onPause com.android.launcher3.Launcher@cfe111f
08-23 17:30:21.324  1314  1443 V ActivityTaskManager: State movement: ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83} from:PAUSING to:PAUSED reason:completePausedLocked
08-23 17:30:21.398  1314  1443 V ActivityTaskManager: State movement: ActivityRecord{ed5f802 u0 com.android.deskclock/.DeskClock t87} from:INITIALIZING to:RESUMED reason:minimalResumeActivityLocked
08-23 17:30:21.706  4887  4887 V Activity: onCreate com.android.deskclock.DeskClock@5f58495: null
08-23 17:30:22.009  4887  4887 V Activity: onStart com.android.deskclock.DeskClock@5f58495
08-23 17:30:22.016  4887  4887 V Activity: onResume com.android.deskclock.DeskClock@5f58495
08-23 17:30:22.955  1314  1443 V ActivityTaskManager: State movement: ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83} from:PAUSED to:STOPPING reason:stopActivityLocked
08-23 17:30:22.957  2055  2055 V Activity: onStop com.android.launcher3.Launcher@cfe111f
08-23 17:30:22.980  1314  2324 V ActivityTaskManager: State movement: ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83} from:STOPPING to:STOPPED reason:activityStoppedLocked
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验一Android环境构建与Activity生命周期 【目的】 安装智能手机开发相关软件平台,并在此基础上测试Activity的生命周期过程。 【要求】 1. 完成智能手机开发平台安装、以及相关配置; 2. 并实现Hello World; 3. 添加Log日志,通过Log日志验证Activity生命周期中的7个方法执行过程; 4. 了解项目的基本文件目录结构,了解Activity周期中的4种状态。 【过程】 (1)建立新项目,实现Hello World; 1)打开Eclipse,选择File -> New -> Android Project. 2)填写project name(helloword),然后选择选择build target(Android 2.1),填写Application name(helloword),Package name(your.helloword)完成创建。 3)运行结果如下图: (2)设置生命周期的Log日志,分别执行相关操作 在hellowordActivity.java文件中依次添加回调函数,分别在各个方法中添加日志监 视语句,复写函数。添加代码如下: package your.helloword; import android.app.Activity; import android.os.Bundle; import android.util.Log; public class HellowordActivity extends Activity { /** Called when the activity is first created. */ private static String TAG="helloword";//设置过滤关键字helloword @Override //完全生命周期开始时被调用,初始化activity public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Log.i(TAG,"(1) onCreate()");} @Override //可视生命周期开始时被调用,对用户界面进行必要的更改 public void onStart() { super.onStart(); Log.i(TAG,"(2) onStart()");} @Override //在活动生命周期开始时被调用,恢复被onPause()停止的用于界面更新的资源 public void onResume() { super.onResume(); Log.i(TAG,"(3) onResume()");} @Override //在重新进入可视生命周期前被调用,载入界面所需要的更改信息 public void onRestart() { super. onRestart(); Log.i(TAG,"(4) onRestart()");} @Override //在活动生命周期结束时被调用,用于保存持久的数据或释放占用的资源 public void onPause() { super.onPause(); Log.i(TAG,"(5) onPause()");} @Override //在可视生命周期结束时被调用,用于保存持久的数据或释放占用的资源 public void onStop() { super.onStop(); Log.i(TAG,"(6) onStop()");} @Override //在完全生命周期结束时被调用,释放资源,包括线程、数据连接等 public void onDestroy() { super.onDestroy(); Log.i(TAG,"(7) onDestroy()");} }     程序运行结果将会显示在Logcat中,打开程序,在LogCat的输出日志中检查输出情况, 执行顺序onCreate()、onStart()、onResume()。运行结果如下: 按下back键,在LogCat的输出日志中检查输出情况,执行顺序onPause()、onStop() 、onDestory()。运行结果如下: 按下home键,在LogCat的输出日志中检查输出情况,执行顺序onPause()、onStop( ); 再启动HelloWorld,在LogCat的输出日志中检查输出情况,执行顺序是onRestart()、 onStart()、onResume(); 实验心得 本次实验目的是学会安装智能手机开发相关软件平台,并在此基础上测试Activity的生命 周期过程。通过本次实验,了解了a
A powerful library that manage Fragment for Android!为"单Activity + 多Fragment","多模块Activity 多Fragment"架构而生,简化开发,轻松解决动画、嵌套、事务相关等问题。为了更好的使用和了解该库,推荐阅读下面的文章:Fragment全解析系列(一):那些年踩过的坑Fragment全解析系列(二):正确的使用姿势Demo演示:均为单Activity 多Fragment,第一个为简单流式demo,第二个为仿微信交互的demo(全页面支持滑动退出),第三个为仿知乎交互的复杂嵌套demo下载APK   特性1、可以快速开发出各种嵌套设计的Fragment App2、悬浮球/摇一摇实时查看Fragment的栈视图Dialog,降低开发难度3、增加启动模式、startForResult等类似Activity方法4、类似Android事件分发机制的Fragment回退方法:onBackPressedSupport(),轻松为每个Fragment实现Back按键事件5、提供onSupportVisible()等生命周期方法,简化嵌套Fragment的开发过程; 提供统一的onLazyInitView()懒加载方法6、提供 Fragment转场动画 系列解决方案,动态更换动画7、提供Activity作用域的EventBus辅助类,Fragment通信更简单、独立(需要使用EventBusActivityScope库)8、支持SwipeBack滑动边缘退出(需要使用Fragmentation_SwipeBack库)      如何使用1. 项目下app的build.gradle中依赖:// appcompat-v7包是必须的,v1.1.9兼容v4-27.0.0 compile 'me.yokeyword:fragmentation:1.1.9' // 如果不想继承SupportActivity/Fragment,自己定制Support,可仅依赖: // compile 'me.yokeyword:fragmentation-core:1.1.9' // 如果想使用SwipeBack 滑动边缘退出Fragment/Activity功能,完整的添加规则如下: compile 'me.yokeyword:fragmentation:1.1.9' // swipeback基于fragmentation, 如果是自定制SupportActivity/Fragment,则参照SwipeBackActivity/Fragment实现即可 compile 'me.yokeyword:fragmentation-swipeback:1.1.9' // Activity作用域的EventBus,更安全,可有效避免after onSavenInstanceState()异常 compile 'me.yokeyword:eventbus-activity-scope:1.1.0' // Your EventBus's version compile 'org.greenrobot:eventbus:{version}'2. Activity继承SupportActivity:// v1.0.0开始,不强制继承SupportActivity,可使用接口+委托形式来实现自己的SupportActivity public class MainActivity extends SupportActivity {     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(...);         // 建议在Application里初始化         Fragmentation.builder()              // 显示悬浮球 ; 其他Mode:SHAKE: 摇一摇唤出   NONE:隐藏              .stackViewMode(Fragmentation.BUBBLE)              .debug(BuildConfig.DEBUG)              ... // 更多查看wiki或demo              .install();         if (findFragment(HomeFragment.class) == null)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值