Android13 Activity生命周期源码梳理(二:源码流程梳理与解析)

477 阅读26分钟

上文(juejin.cn/spost/73646… 中我们从宏观角度大致分析了activity生命周期流转过程中的event日志,生命周期事务以及执行机制,生命周期的超时机制,以及数据保存恢复机制。

本文则承接上文,从详细源码的角度来解析从activity a中启动 activity b的过程中各个生命周期流转的源码执行流程。

源码阅读建议一定要亲自去系统源码中过一遍流程,博客永远只是一个提高效率的外部参考,只有自己亲自过一遍源码流程,最好是亲手做几个实验验证自己的疑问点,只有这样才能在记忆中形成自己的认知与长远的记忆。

纸上得来终觉浅,绝知此事要躬行。

生命周期源码解读

在阅读庞大繁杂的源码之前,可以先熟悉几个结论,帮助你更好地把握整个源码流程。

  1. 所有生命周期的执行流程与对应函数名都是极其相似与模板化的,都是从服务端发送对应的生命周期事务开始,按照模板流程执行下去,直到activity的对应生命周期函数被调用。通过本文目录也能一窥大概。
  2. 可以重点关注一下对应生命周期event日志打印的位置,帮助我们更好地通过event日志来反推问题发生时的流程状态。一个生命周期会对应生命周期执行前与执行后两个event日志,正常情况下都是成对出现的。
  3. 可以重点关注onCreate 与onResume流程,一个揭示了activity初始化创建过程,一个包含了window添加view的过程。
  4. activity a的stop与destroy流程通常是依赖消息机制的IdleHandler来延后执行的,当然会有超时机制来强制执行,确保生命周期的完整性。

Activity启动创建流程

当我们在APP进程调用startActivity方法去启动Activity时,会通过binder跨进程通信获取ActivityTaskManagerService,进入system_server进程执行ActivityTaskManagerService # startActivityAsUser方法进行具体的activity启动流程。

base/core/java/android/app/ContextImpl.java

@Override
public void startActivity(Intent intent, Bundle options) {
    warnIfCallingFromSystemProcess();
    mMainThread.getInstrumentation().execStartActivity(
            getOuterContext(), mMainThread.getApplicationThread(), null,
            (Activity) null, intent, -1, options);
}
base/core/java/android/app/Activity.java

public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
        @Nullable Bundle options) {
        ......
        options = transferSpringboardActivityOptions(options);
        Instrumentation.ActivityResult ar =
            mInstrumentation.execStartActivity(
                this, mMainThread.getApplicationThread(), mToken, this,
                intent, requestCode, options);
         ......
 }

无论通过Context还是Activity来启动新的Activity,都会统一调用Instrumentation#execStartActivity()方法。

Instrumentation#execStartActivity

Instrumentation中的execStartActivity方法会调用ActivityTaskManager.getService(),通过 AIDL 来调用 ATMS 的 startActivity 方法,返回 ActivityTaskManagerService.startActivity 的结果。至此启动Activity的过程从App进程进入了system_server进程。

base/core/java/android/app/Instrumentation.java

@UnsupportedAppUsage
public ActivityResult execStartActivity(
        Context who, IBinder contextThread, IBinder token, Activity target,
        Intent intent, int requestCode, Bundle options) {
    IApplicationThread whoThread = (IApplicationThread) contextThread;
    ......
    try {
        intent.migrateExtraStreamToClipData(who);
        intent.prepareToLeaveProcess(who);
int result = ActivityTaskManager.getService().startActivity(whoThread,
                who.getOpPackageName(), who.getAttributionTag(), intent,
                intent.resolveTypeIfNeeded(who.getContentResolver()), token,
                target != null ? target.mEmbeddedID : null, requestCode, 0, null, options);
        notifyStartActivityResult(result, options);
        checkStartActivityResult(result, intent);
    } catch (RemoteException e) {
        throw new RuntimeException("Failure from system", e);
    }
    return null;
}
base/core/java/android/app/ActivityTaskManager.java

public static IActivityTaskManager getService() {
    return IActivityTaskManagerSingleton.get();
}

private static final Singleton<IActivityTaskManager> IActivityTaskManagerSingleton =
        new Singleton<IActivityTaskManager>() {
            @Override
            protected IActivityTaskManager create() {
                final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);
                return IActivityTaskManager.Stub.asInterface(b);
            }
        };

ActivityTaskManagerService#startActivityAsUser

base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java

public class ActivityTaskManagerService extends IActivityTaskManager.Stub {

    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) {
            
            // A quick path (skip general intent/task resolving) to start recents animation if the
            // recents (or home) activity is available in background.
            ......
            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(opts)
                    .setUserId(userId)
                    .execute();        
            
            }
        
}

在通过 startActivityAsUser方法中通过 getActivityStartController().obtainStarter 获取ActivityStarter 对象并设置相关参数,然后执行 execute 方法。

ActivityStarter#execute

execute方法调用了executeRequest方法。

executeRequest 方法很长,核心是实例化了 ActivityRecord,并调用 startActivityUnchecked方法。

frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java

/**
* This class collects all the logic for determining how an intent and flags should be turned into
* an activity and associated task and root task.
*/
class ActivityStarter {
    
     /**
    * 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 {
                onExecutionStarted();
                // ... 
                int res;
                synchronized (mService.mGlobalLock) {
                    // ...
                    res = executeRequest(mRequest);
                    // ...
                    }
                    return getExternalResult(res);
                }
            } finally {
                onExecutionComplete();
            }
        }
   
     /**
    * Executing activity start request and starts the journey of starting an activity. Here
    * begins with performing several preliminary checks. The normally activity launch flow will
    * go through { @link #startActivityUnchecked} to { @link #startActivityInner}.
    */
    private int executeRequest(Request request) {
    ......
    final ActivityRecord r = new ActivityRecord.Builder(mService)
        .setCaller(callerApp)
        .setLaunchedFromPid(callingPid)
        .setLaunchedFromUid(callingUid)
        .setLaunchedFromPackage(callingPackage)
        .setLaunchedFromFeature(callingFeatureId)
        .setIntent(intent)
        .setResolvedType(resolvedType)
        .setActivityInfo(aInfo)
        .setConfiguration(mService.getGlobalConfiguration())
        .setResultTo(resultRecord)
        .setResultWho(resultWho)
        .setRequestCode(requestCode)
        .setComponentSpecified(request.componentSpecified)
        .setRootVoiceInteraction(voiceSession != null)
        .setActivityOptions(checkedOptions)
        .setSourceRecord(sourceRecord)
        .build();
        
        ......
        
        mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession,
            request.voiceInteractor, startFlags, true /* doResume */ , checkedOptions,
            inTask, inTaskFragment, restrictedBgActivity, intentGrants);
        ......
    } 
}

ActivityStarter#startActivityUnchecked

frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java

/**
* This class collects all the logic for determining how an intent and flags should be turned into
* an activity and associated task and root task.
*/
class ActivityStarter {
    
    /**
    * 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,
            TaskFragment inTaskFragment, boolean restrictedBgActivity,
            NeededUriGrants intentGrants) {
            ......
            result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor,
                startFlags, doResume, options, inTask, inTaskFragment, restrictedBgActivity,
                intentGrants);
            ......
            }

}

ActivityStarter#startActivityInner

startActivityInner 方法中的代码比较复杂,这个方法里主要是处理任务栈相关的逻辑,如果找到可用的任务栈则直接使用这个任务栈,如果没有找到,则新建一个任务栈。 在完成任务栈的处理之后通过mRootWindowContainer.resumeFocusedTasksTopActivities继续 Activity 的启动流程,这里的 mRootWindowContainer 是 RootWindowContainer 的实例.

frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java

/**
* This class collects all the logic for determining how an intent and flags should be turned into
* an activity and associated task and root task.
*/
class ActivityStarter {

    int startActivityInner(final ActivityRecord r, ActivityRecord sourceRecord,
                IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
                int startFlags, boolean doResume, ActivityOptions options, Task inTask,
                TaskFragment inTaskFragment, boolean restrictedBgActivity,
                NeededUriGrants intentGrants) {
            setInitialState(r, options, inTask, inTaskFragment, doResume, startFlags, sourceRecord,
                    voiceSession, voiceInteractor, restrictedBgActivity);
                    
            // 处理 Intent 中携带的 flags
            computeLaunchingTaskFlags();
            
            // 获取启动 Activity 的任务栈,这里即获取 MainActivity 所在的任务栈 
            computeSourceRootTask();
            ......
            // 查找可用的任务栈
            final Task reusedTask = getReusableTask();
           ......
            // 如果 reusedTask 不空,则使用 reusedTask 任务栈,否则寻找目标任务栈
            final Task targetTask = reusedTask != null ? reusedTask : computeTargetTask();
            // 目标任务栈为空,则标记为使用新任务栈,需要新建任务栈
            final boolean newTask = targetTask == null;
            mTargetTask = targetTask;
            computeLaunchParams(r, sourceRecord, targetTask);
    
            if (newTask) {
                // 创建一个新的任务栈
                final Task taskToAffiliate = (mLaunchTaskBehind && mSourceRecord != null)
                        ? mSourceRecord.getTask() : null;
                // 将 Activity 放入新建的任务栈        
                setNewTask(taskToAffiliate);
            } else if (mAddingToTask) {
                // 加入已有的任务栈
                addOrReparentStartingActivity(targetTask, "adding to task");
            }
            ......
            if (mDoResume) {
                    ......
                    mRootWindowContainer.resumeFocusedTasksTopActivities(
                            mTargetRootTask, mStartActivity, mOptions, mTransientLaunch);
                }
            }
            
            return START_SUCCESS;
        }
        
}

RootWindowContainer#resumeFocusedTasksTopActivities

这个方法中将启动相关的代码交给了 Task 的 resumeTopActivityUncheckedLocked 方法

frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java

 boolean resumeFocusedTasksTopActivities(
            Task targetRootTask, ActivityRecord target, ActivityOptions targetOptions,
            boolean deferPause) {
        ......
        boolean result = false;
        if (targetRootTask != null && (targetRootTask.isTopRootTaskInDisplayArea()
                || getTopDisplayFocusedRootTask() == targetRootTask)) {
            result = targetRootTask.resumeTopActivityUncheckedLocked(target, targetOptions,deferPause);
        }
        ......
        return result;
    }
  • 第一次调用是启动流程 startActivity 触发的,执行到 TaskFragment#resumeTopActivity 方法时,触发 SourceActivity 的 pause 流程和创建 TargetActivity 的进程。(应用内启动Activity不会触发进程创建)
  • 第二次触发是 SourceActivity 执行完 pause 后,就会触发 completePause 流程,这次执行到 TaskFragment#resumeTopActivity 方法时走的是触发启动 TargetActivity 流程。完整调用链如下:
ActivityClientController::activityPaused
    ActivityRecord::activityPaused
        TaskFragment::completePause
            RootWindowContainer::resumeFocusedTasksTopActivities  --分支1  再次执行 resumeFocusedTasksTopActivities
                RootWindowContainer::resumeFocusedTasksTopActivities
                    Task::resumeTopActivityUncheckedLocked
                        Task::resumeTopActivityInnerLocked
                            TaskFragment::resumeTopActivity
                                ActivityTaskSupervisor::startSpecificActivity  -- 启动TargetActivity
            RootWindowContainer::ensureActivitiesVisible          --分支2  确保有Activity显示流程

completePause 流程再次执行 RootWindowContainer::resumeFocusedTasksTopActivities 方法时内部还会触发 TaskFragment::resumeTopActivity 方法,而这一次触发的是启动 TargetActivity 的流程。

Task#resumeTopActivityUncheckedLocked

在 Task 的 resumeTopActivityUncheckedLocked 方法中进而又调用了resumeTopActivityInnerLocked,在 resumeTopActivityInnerLocked 中通过 TaskFragment 调用了 resumeTopActivity。

frameworks/base/services/core/java/com/android/server/wm/Task.java

boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options,
            boolean deferPause) {
        // ...

        boolean someActivityResumed = false;
        try {
            // Protect against recursion.
            mInResumeTopActivity = true;

            if (isLeafTask()) {
                if (isFocusableAndVisible()) {
                    someActivityResumed = resumeTopActivityInnerLocked(prev, options, deferPause);
                }
            } else {
                       // ...
                   }
            }

        // ...

        return someActivityResumed;
    }
    

    @GuardedBy("mService")
    private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options,
            boolean deferPause) {
        if (!mAtmService.isBooting() && !mAtmService.isBooted()) {
            // Not ready yet!
            return false;
        }
        // 任务栈栈顶正在运行的 Activity 
        final ActivityRecord topActivity = topRunningActivity(true /* focusableOnly */);
        if (topActivity == null) {
            // 空任务栈 There are no activities left in this task, let's look somewhere else.
            return resumeNextFocusableActivityWhenRootTaskIsEmpty(prev, options);
        }

        final boolean[] resumed = new boolean[1];
        final TaskFragment topFragment = topActivity.getTaskFragment();
        resumed[0] = topFragment.resumeTopActivity(prev, options, deferPause);
        // ...
        return resumed[0];
    }
    

TaskFragment#resumeTopActivity

resumeTopActivity 方法中主要有两部分内容。

  • next.attachedToProcess() 为 true,即要启动的这个 Activity 已经存在,并且设置了像“singleInstance” 的启动模式,无需重新创建 Activity 的情况下,则先通过 ClientTransaction 添加了一个 NewIntentItem 的 callback,接下来通过 setLifecycleStateRequest 设置了一个 ResumeActivityItem 对象。

  • next.attachedToProcess() 为 false ,则继续执行 Activity 的启动流程

frameworks/base/services/core/java/com/android/server/wm/TaskFragment.java

final ActivityTaskSupervisor mTaskSupervisor;

final boolean resumeTopActivity(ActivityRecord prev, ActivityOptions options,
            boolean deferPause) {
        ActivityRecord next = topRunningActivity(true /* focusableOnly */);
         // ...
         
         if (mResumedActivity != null) {
             // 暂停栈顶的Activity
            pausing |= startPausing(mTaskSupervisor.mUserLeaving, false /* uiSleeping */, next, "resumeTopActivity");
        }
         
        // ... 
           
        // 要启动的 Activity 已存在,且不需要重新创建,例如设置了 singleTask 或 singleTop启动模式
        if (next.attachedToProcess()) {
            // ...

            ActivityRecord lastResumedActivity =
                    lastFocusedRootTask == null ? null
                            : lastFocusedRootTask.getTopResumedActivity();
            final ActivityRecord.State lastState = next.getState();

            mAtmService.updateCpuStats();

            next.setState(RESUMED, "resumeTopActivity");

            // Have the window manager re-evaluate the orientation of
            // the screen based on the new activity order.
            boolean notUpdated = true;

            // ...

            try {
                // 开启一个事务
                final ClientTransaction transaction =
                        ClientTransaction.obtain(next.app.getThread(), next.token);
                 // ...

                if (next.newIntents != null) {
                    // 添加 onNewIntent 的 callback ,最终会在APP端执行 onNewIntent()
                    transaction.addCallback(
                            NewIntentItem.obtain(next.newIntents, true /* resume */));
                }

                // ...
               
                // 设置 Activity 最终的生命周期状态为 Resume
                transaction.setLifecycleStateRequest(
                        ResumeActivityItem.obtain(next.app.getReportedProcState(),
                                dc.isNextTransitionForward()));
                // Flag1:开始执行事务                
                mAtmService.getLifecycleManager().scheduleTransaction(transaction);

            } catch (Exception e) {
                // ...
                
                // Resume 异常,重新启动
                mTaskSupervisor.startSpecificActivity(next, true, false);
                return true;
            }

           // ...
        } else {
            // ...
            
            // 启动 Activity
            mTaskSupervisor.startSpecificActivity(next, true, true);
        }

        return true;
    }

ActivityTaskSupervisor#startSpecificActivity

startSpecificActivity 方法中最核心的逻辑是调用了 realStartActivityLocked ,这个方法中同样是获取了一个 ClientTransaction 实例,并调用了它的 addCallback 方法,与上边不同的是,这里添加了一个 LaunchActivityItem 实例。

frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java


    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) {
               // ...
            }

            // ...
        }

        // ...
    }
    
   boolean realStartActivityLocked(ActivityRecord r, WindowProcessController proc,
            boolean andResume, boolean checkConfig) throws RemoteException {

        // ...

        final Task task = r.getTask();
        final Task rootTask = task.getRootTask();

        try {
                // ...

                // 创建启动 Activity 的事务
                final ClientTransaction clientTransaction = ClientTransaction.obtain(
                        proc.getThread(), r.token);

                final boolean isTransitionForward = r.isTransitionForward();
                final IBinder fragmentToken = r.getTaskFragment().getFragmentToken();
                
                // 添加启动 Activity 的 callback,执行launchActivity
                clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),
                        System.identityHashCode(r), r.info,
                        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));

                // Activity 启动后最终的生命周期状态
                final ActivityLifecycleItem lifecycleItem;
                if (andResume) {
                    // 将最终生命周期设置为 Resume 状态
                    lifecycleItem = ResumeActivityItem.obtain(isTransitionForward);
                } else {
                    // 将最终生命周期设置为 Pause 状态
                    lifecycleItem = PauseActivityItem.obtain();
                }
                // 设置 Activity 启动后最终的生命周期状态
                clientTransaction.setLifecycleStateRequest(lifecycleItem);

                // 开启事务
                mService.getLifecycleManager().scheduleTransaction(clientTransaction);

               // ...

            } catch (RemoteException e) {
                // ...
            }
        } finally {
            // ...
        }

        // ...

        return true;
    }
 

getLifecycleManager 返回了一个 ClientLifecycleManager 的实例,并调用了 scheduleTransaction 方法。

在 schedule 方法中通过 mClient 调用了 scheduleTransaction, 这里的 mClient 即为 IApplicationThread。

通过 scheduleTransaction 方法回到了客户端,并且将 ClientTransaction 作为参数传了过去。所以,ClientTransaction 的执行逻辑实际上在客户端中执行的。

ClientTransaction中利用一个ArrayList来保存所有ClientTransactionItem,后续按照顺序执行。

base/core/java/android/app/servertransaction/ClientTransaction.java

/**
* A container that holds a sequence of messages, which may be sent to a client.
* This includes a list of callbacks and a final lifecycle state.
*/
public class ClientTransaction implements Parcelable, ObjectPoolItem {

    /** A list of individual callbacks to a client. */
@UnsupportedAppUsage
    private List<ClientTransactionItem> mActivityCallbacks;
    
    /**
    * Add a message to the end of the sequence of callbacks.
    * @param activityCallback A single message that can contain a lifecycle request/callback.
    */
    public void addCallback(ClientTransactionItem activityCallback) {
        if (mActivityCallbacks == null) {
            mActivityCallbacks = new ArrayList<>();
        }
        mActivityCallbacks.add(activityCallback);
    }
    
}

ActivityThread.ApplicationThread#scheduleTransaction

frameworks/base/core/java/android/app/ActivityThread#ApplicationThread

    @Override
    public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
        ActivityThread.this.scheduleTransaction(transaction);
    }

scheduleTransaction 的源码在ActivityThread 的父类 ClientTransactionHandler 中.

ClientTransactionHandler#scheduleTransaction

这里将 transaction 作为参数调用了 sendMessage 方法.

frameworks/base/core/java/android/app/ClientTransactionHandler.java

    void scheduleTransaction(ClientTransaction transaction) {
        transaction.preExecute(this);
        sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
    }
base/core/java/android/app/ActivityThread.java

public final class ActivityThread extends ClientTransactionHandler
        implements ActivityThreadInternal {
    private void sendMessage(int what, Object obj, int arg1, int arg2, boolean async) {
        Message msg = Message.obtain();
        msg.what = what;
        msg.obj = obj;
        msg.arg1 = arg1;
        msg.arg2 = arg2;
        if (async) {
            msg.setAsynchronous(true);
        }
        mH.sendMessage(msg);
    }
}

最终将 ClientTransaction 与 EXECUTE_TRANSACTION 打包成一个 Message ,并且将这个 Message 设置成了异步消息,Message 被设置为异步消息后具有优先执行权,最终通过 mH 发送了出去,这里的 mH 是一个继承自 Handler 的 H 类,位于 ActivityThread 类的内部。

ActivityThread.H#handleMessage

通过 Message 拿到 ClientTransaction 后,然后通过 TransactionExecutor 的 execute 方法来执行 ClientTransaction。

frameworks/base/core/java/android/app/ActivityThread#H

public void handleMessage(Message msg) {
    switch (msg.what) {
    case EXECUTE_TRANSACTION:
            final ClientTransaction transaction = (ClientTransaction) msg.obj;
            mTransactionExecutor.execute(transaction);
            // ...
             break;
    
    }
}

TransactionExecutor#execute

frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java

/**
* Resolve transaction.
* First all callbacks will be executed in the order they appear in the list. If a callback
* requires a certain pre- or post-execution state, the client will be transitioned accordingly.
* Then the client will cycle to the final lifecycle state if provided. Otherwise, it will
* either remain in the initial state, or last state needed by a callback.
*/
public void execute(ClientTransaction transaction) {

       // ...
        
        // 执行 callback
        executeCallbacks(transaction);
        // 执行 lifecycleState
        executeLifecycleState(transaction);
        
        mPendingActions.clear();
       
    }   

这个方法里的执行逻辑可以分为两部分:

  • 通过 executeCallbacks 方法执行所有被添加进来的 ClientTransactionItem

  • 通过 executeLifecycleState 方法将 Activity 的生命周期执行到指定的状态

TransactionExecutor#executeCallbacks

在 executeCallbacks 中遍历了所有的 ClientTransactionItem 并执行了 ClientTransactionItem 的 execute 方法。

frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java

/** Cycle through all states requested by callbacks and execute them at proper times. */
public void executeCallbacks(ClientTransaction transaction) {
        ...
        //按顺序遍历执行ClientTransactionItem
        final int size = callbacks.size();
        for (int i = 0; i < size; ++i) {
            ......
            final ClientTransactionItem item = callbacks.get(i);
            item.execute(mTransactionHandler, token, mPendingActions);
            item.postExecute(mTransactionHandler, token, mPendingActions);
            
            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);
            }
        }
    }

TransactionExecutor#executeLifecycleState

frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java
   
   /** Transition to the final state if requested by the transaction. */
   private void executeLifecycleState(ClientTransaction transaction) {
        final ActivityLifecycleItem lifecycleItem = transaction.getLifecycleStateRequest();
        // ...

        // 第二个参数为执行完时的生命周状态
        cycleToPath(r, lifecycleItem.getTargetState(), true /* excludeLastState */, transaction);

        // Execute the final transition with proper parameters.
        lifecycleItem.execute(mTransactionHandler, token, mPendingActions);
        
        lifecycleItem.postExecute(mTransactionHandler, token, mPendingActions);
    }

关键点在于 cycleToPath 。同时,通过 lifecycleItem.getTargetState() 作为结束时的生命周期状态。由于此时设置的是一个 ResumeActivityItem,它的 getTargetState 返回的是一个 ON_RESUME 的值,

TransactionExecutor#cycleToPath

frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java

private void cycleToPath(ActivityClientRecord r, int finish, boolean excludeLastState,
            ClientTransaction transaction) {
        // 获取当前 Activity 的生命周期状态,即开始时的状态    
        final int start = r.getLifecycleState();
        // 获取要执行的生命周期数组
        final IntArray path = mHelper.getLifecyclePath(start, finish, excludeLastState);
        // 按顺序执行 Activity 的生命周期
        performLifecycleSequence(r, path, transaction);
    }

在这个方法中,首先获取了当前 Activity 生命周期状态,即开始执行 getLifecyclePath 时 Activity 的生命周期状态,由于 executeLifecycleState 方法是在 executeCallback 之后执行的,上面我们已经提到此时的 Activity 已经执行完了创建流程,并执行过了 onCreate 的生命周期。因此,这里的 start 应该是 ON_CREATE 状态,ON_CREATE 的值为 1。

根据上边分析,此时的 start 为 ON_CREATE(值为 1),而 finish 的值为 ON_RESUME(值为 2)。因此,执行完 getLifecyclePath 后,会得到一个包含了 ON_START 与 ON_RESUME 的数组。

TransactionExecutor#performLifecycleSequence

frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java

    /** Transition the client through previously initialized state sequence. */
    private void performLifecycleSequence(ActivityClientRecord r, IntArray path,
            ClientTransaction transaction) {
        final int size = path.size();
        // 遍历数组,执行 Activity 的生命周
        for (int i = 0, state; i < size; i++) {
            state = path.get(i);

            switch (state) {
                case ON_CREATE:
                    mTransactionHandler.handleLaunchActivity(r, mPendingActions,
                            null /* customIntent */);
                    break;
                case ON_START:
                    mTransactionHandler.handleStartActivity(r, mPendingActions,
                            null /* activityOptions */);
                    break;
                case ON_RESUME:
                    mTransactionHandler.handleResumeActivity(r, false /* finalStateRequest */,
                            r.isForward, "LIFECYCLER_RESUME_ACTIVITY");
                    break;
                case ON_PAUSE:
                    mTransactionHandler.handlePauseActivity(r, false /* finished */,
                            false /* userLeaving */, 0 /* configChanges */,
                            false /* autoEnteringPip */, mPendingActions,
                            "LIFECYCLER_PAUSE_ACTIVITY");
                    break;
                case ON_STOP:
                    mTransactionHandler.handleStopActivity(r, 0 /* configChanges */,
                            mPendingActions, false /* finalStateRequest */,
                            "LIFECYCLER_STOP_ACTIVITY");
                    break;
                case ON_DESTROY:
                    mTransactionHandler.handleDestroyActivity(r, false /* finishing */,
                            0 /* configChanges */, false /* getNonConfigInstance */,
                            "performLifecycleSequence. cycling to:" + path.get(size - 1));
                    break;
                case ON_RESTART:
                    mTransactionHandler.performRestartActivity(r, false /* start */);
                    break;
                default:
                    throw new IllegalArgumentException("Unexpected lifecycle state: " + state);
            }
        }
    }

performLifecycleSequence 方法中则是遍历了这个数组。因为此时的数组中有只有 ON_START 与 ON_RESUME 两个值,因此,这里分别先后执行了 mTransactionHandler.handleStartActivitymTransactionHandler.handleResumeActivity,即调用了 ApplicationThread 的 handleStartActivity 与 handleResumeActivity 来执行 Activity 的 onStart 与 onResume 的生命周期。

LaunchActivityItem#execute

LaunchActivityItem 的 execute 方法调用了 ClientTransactionHandler 的 handleLaunchActivity,而这里的 ClientTransactionHandler 就是 ActivityThread。

frameworks/base/core/java/android/app/servertransaction/LaunchActivityItem.java

    @Override
    public void execute(ClientTransactionHandler client, IBinder token,
            PendingTransactionActions pendingActions) {
        
        ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo,
                mOverrideConfig, mCompatInfo, mReferrer, mVoiceInteractor, mState, mPersistentState,
                mPendingResults, mPendingNewIntents, mActivityOptions, mIsForward, mProfilerInfo,
                client, mAssistToken, mShareableActivityToken, mLaunchedFromBubble,
                mTaskFragmentToken);
                
        client.handleLaunchActivity(r, pendingActions, null /* customIntent */);
    }

onCreate

ActivityThread#handleLaunchActivity

frameworks/base/core/java/android/app/ActivityThread.java

public Activity handleLaunchActivity(ActivityClientRecord r,
            PendingTransactionActions pendingActions, Intent customIntent) {
        // If we are getting ready to gc after going to the background, well
        // we are back active so skip it.
        unscheduleGcIdler();
        mSomeActivitiesChanged = true;
        ......
        // 初始化 WindowManagerGlobal
        WindowManagerGlobal.initialize();

        // 调用 performLaunchActivity 执行 Activity 的创建流程
        final Activity a = performLaunchActivity(r, customIntent);
        ......
        return a;
    }

在 handleLaunchActivity 方法中首先去初始化了 WindowManagerGlobal,紧接着调用了 performLaunchActivity 并返回了一个 Activity 实例。

ActivityThread#performLaunchActivity

这个方法中的主要逻辑可以分为两部分,第一部分是实例化 Activity;第二部分是执行 Activity 的 onCreate 的生命周期。

frameworks/base/core/java/android/app/ActivityThread.java

/**  Core implementation of activity launch. */
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
        ActivityInfo aInfo = r.activityInfo;
        ......
        ContextImpl appContext = createBaseContextForActivity(r);
        Activity activity = null;
        try {
            // 在 Instrumentation 中通过反射实例化 Activity 
            java.lang.ClassLoader cl = appContext.getClassLoader();
            activity = mInstrumentation.newActivity(
                    cl, component.getClassName(), r.intent);
            StrictMode.incrementExpectedActivityCount(activity.getClass());
            r.intent.setExtrasClassLoader(cl);
            r.intent.prepareToEnterProcess(isProtectedComponent(r.activityInfo),
                    appContext.getAttributionSource());
            if (r.state != null) {
                r.state.setClassLoader(cl);
            }
        } catch (Exception e) {
            ......
        }

       // 执行 Activity 生命周期
       
       try {
        Application app = r.packageInfo.makeApplicationInner(false, mInstrumentation);
        ......
        if (activity != null) {
            CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager());
            Configuration config =
                    new Configuration(mConfigurationController.getCompatConfiguration());
            if (r.overrideConfig != null) {
                config.updateFrom(r.overrideConfig);
            }
            if (DEBUG_CONFIGURATION) Slog.v(TAG, "Launching activity "
                    + r.activityInfo.name + " with config " + config);  
            ...              
            activity.attach(appContext, this, getInstrumentation(), r.token,
                    r.ident, app, r.intent, r.activityInfo, title, r.parent,
                    r.embeddedID, r.lastNonConfigurationInstances, config,
                    r.referrer, r.voiceInteractor, window, r.activityConfigCallback,
                    r.assistToken, r.shareableActivityToken);
             ...
             // 设置 Activity 主题
             int theme = r.activityInfo.getThemeResource();
            if (theme != 0) {
                activity.setTheme(theme);
            }
            ...               
            r.activity = activity;
            // 调用 Activity 的 onCreate 方法
            if (r.isPersistable()) {
                mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
            } else {
                mInstrumentation.callActivityOnCreate(activity, r.state);
            }
            
          }
          r.setState(ON_CREATE);
        }catch (Exception e) {
        ...
        }
        

        return activity;
    }

上述方法中首先获取 Activity 的 title 以及 Configuration 等相关参数,然后再次调用 Activity 的 attach 方法,并将这些参数传入。

Activity#attach

attach 方法中主要做了初始化 PhoneWindow 的一些操作。

frameworks/base/core/java/android/app/Activity.java

final void attach(Context context, ActivityThread aThread,
            Instrumentation instr, IBinder token, int ident,
            Application application, Intent intent, ActivityInfo info,
            CharSequence title, Activity parent, String id,
            NonConfigurationInstances lastNonConfigurationInstances,
            Configuration config, String referrer, IVoiceInteractor voiceInteractor,
            Window window, ActivityConfigCallback activityConfigCallback, IBinder assistToken,
            IBinder shareableActivityToken) {
        attachBaseContext(context);

        mFragments.attachHost(null /*parent*/);
        // 实例化 PhoneWindow,Activity 中持有 PhoneWindow
        mWindow = new PhoneWindow(this, window, activityConfigCallback);
        mWindow.setWindowControllerCallback(mWindowControllerCallback);
        // 将 Activity 自身设置到 PhoneWindow
        mWindow.setCallback(this);
        mWindow.setOnWindowDismissedCallback(this);
        mWindow.getLayoutInflater().setPrivateFactory(this);
        
        // ...
        
        // PhoneWindow 关联 WindowManager
        mWindow.setWindowManager(
                (WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
                mToken, mComponent.flattenToString(),
                (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
        if (mParent != null) {
            mWindow.setContainer(mParent.getWindow());
        }
        // Activity 中持有 WindowManager
        mWindowManager = mWindow.getWindowManager();
        mCurrentConfig = config;

        mWindow.setColorMode(info.colorMode);
        mWindow.setPreferMinimalPostProcessing(
                (info.flags & ActivityInfo.FLAG_PREFER_MINIMAL_POST_PROCESSING) != 0);

        getAutofillClientController().onActivityAttached(application);
        setContentCaptureOptions(application.getContentCaptureOptions());
    }

Instrumentation#callActivityOnCreate

base/core/java/android/app/Instrumentation.java

    public void callActivityOnCreate(Activity activity, Bundle icicle) {
        prePerformCreate(activity);
        activity.performCreate(icicle);
        postPerformCreate(activity);
    }
    

Activity#performCreate

base/core/java/android/app/Activity.java

final void performCreate(Bundle icicle, PersistableBundle persistentState) {

    // initialize mIsInMultiWindowMode and mIsInPictureInPictureMode before onCreate
    final int windowingMode = getResources().getConfiguration().windowConfiguration
            .getWindowingMode();
    mIsInMultiWindowMode = inMultiWindowMode(windowingMode);
    mIsInPictureInPictureMode = windowingMode == WINDOWING_MODE_PINNED;
    //调用onCreate方法
    if (persistentState != null) {
        onCreate(icicle, persistentState);
    } else {
        onCreate(icicle);
    }
    EventLogTags.writeWmOnCreateCalled(mIdent, getComponentName().getClassName(),
            "performCreate");
            
    ......        
}

OnStart

ActivityRecord#makeActiveIfNeeded

base/services/core/java/com/android/server/wm/ActivityRecord.java

boolean makeActiveIfNeeded(ActivityRecord activeActivity) {
    if (shouldResumeActivity(activeActivity)) {
        ...
    } else if (shouldPauseActivity(activeActivity)) {
        ...
    } else if (shouldStartActivity()) {
        if (DEBUG_VISIBILITY) {
            Slog.v(TAG_VISIBILITY, "Start visible activity, " + this);
        }
        setState(STARTED, "makeActiveIfNeeded");

        try {
            mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), token,
                    StartActivityItem.obtain(takeOptions()));
        } catch (Exception e) {
            Slog.w(TAG, "Exception thrown sending start: " + intent.getComponent(), e);
        }
        // The activity may be waiting for stop, but that is no longer appropriate if we are
 // starting the activity again
mTaskSupervisor.mStoppingActivities.remove(this);
    }
    return false;
}

ActivityThread#handleStartActivity

在handleStartActivity方法中会调用Activity的OnRestoreInstanceState方法进行之前保存的参数的恢复。


frameworks/base/core/java/android/app/ActivityThread.java

public void handleStartActivity(ActivityClientRecord r,
            PendingTransactionActions pendingActions, ActivityOptions activityOptions) {
        final Activity activity = r.activity;
        ......
        unscheduleGcIdler();
        if (activityOptions != null) {
            activity.mPendingOptions = activityOptions;
        }

        // 调用 Activity 的 performStart 进而执行 onStart
        activity.performStart("handleStartActivity");
        // 将生命周状态设置为 ON_START
        r.setState(ON_START);

        // Restore instance state
        if (pendingActions.shouldRestoreInstanceState()) {
            if (r.isPersistable()) {
                if (r.state != null || r.persistentState != null) {
                    mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state,
                            r.persistentState);
                }
            } else if (r.state != null) {
                mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state);
            }
        }

       // ...
       updateVisibility(r, true /* show */ );
    }

Activity#performStart

base/core/java/android/app/Activity.java

final void performStart(String reason) {

    mInstrumentation.callActivityOnStart(this);
    EventLogTags.writeWmOnStartCalled(mIdent, getComponentName().getClassName(), reason);
    ...
    mFragments.dispatchStart();
    mFragments.reportLoaderStart();
    ...
}

Instrumentation#callActivityOnStart

base/core/java/android/app/Instrumentation.java

public void callActivityOnStart(Activity activity) {
    activity.onStart();
}

Activity#onStart

base/core/java/android/app/Activity.java

@CallSuper
protected void onStart() {
    if (DEBUG_LIFECYCLE) Slog.v(TAG, "onStart " + this);
    mCalled = true;

    mFragments.doLoaderStart();

    dispatchActivityStarted();

    getAutofillClientController().onActivityStarted();
}

onResume

TaskFragment#resumeTopActivity

resumeTopActivity方法特别复杂,其中会构建ResumeActivityItem执行resume流程。

base/services/core/java/com/android/server/wm/TaskFragment.java

final boolean resumeTopActivity(ActivityRecord prev, ActivityOptions options,
        boolean deferPause) {
    ActivityRecord next = topRunningActivity(true /* focusableOnly */ );
    if (next == null || !next.canResumeByCompat()) {
        return false;
    }
        
    if (next.attachedToProcess()) {
        if (DEBUG_SWITCH) {
            Slog.v(TAG_SWITCH, "Resume running: " + next + " stopped=" + next.stopped
                    + " visibleRequested=" + next.mVisibleRequested);
        }
    
            // Well the app will no longer be stopped.
            // Clear app token stopped state in window manager if needed.
            next.notifyAppResumed(next.stopped);
            
            EventLogTags.writeWmResumeActivity(next.mUserId, System.identityHashCode(next),
                    next.getTask().mTaskId, next.shortComponentName);
            
            mAtmService.getAppWarningsLocked().onResumeActivity(next);
            next.app.setPendingUiCleanAndForceProcessStateUpTo(mAtmService.mTopProcessState);
            next.abortAndClearOptionsAnimation();
            transaction.setLifecycleStateRequest(
                    ResumeActivityItem.obtain(next.app.getReportedProcState(),
                            dc.isNextTransitionForward()));
            mAtmService.getLifecycleManager().scheduleTransaction(transaction);
            
            ProtoLog.d(WM_DEBUG_STATES, "resumeTopActivity: Resumed %s", next);
            
    } 
    
}       

ResumeActivityItem#execute

base/core/java/android/app/servertransaction/ResumeActivityItem.java

@Override
public void execute(ClientTransactionHandler client, ActivityClientRecord r,
        PendingTransactionActions pendingActions) {
    Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityResume");
    client.handleResumeActivity(r, true /* finalStateRequest */ , mIsForward,
            "RESUME_ACTIVITY");
    Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
}

ActivityThread#handleResumeActivity

handleResumeActivity 方法中的逻辑比较复杂,但核心主要有两点:

  • 调用 performResumeActivity 执行 onResume 的生命周期。

  • 调用wm.addView(decor, l); 添加DecorView到 Window 中。

base/core/java/android/app/ActivityThread.java

@Override
public void handleResumeActivity(ActivityClientRecord r, boolean finalStateRequest,
        boolean isForward, String reason) {

        // skip below steps for double-resume and r.mFinish = true case.
        if (!performResumeActivity(r, finalStateRequest, reason)) {
            return;
        }
        ......
        
        // If the window hasn't yet been added to the window manager,
        // and this guy didn't finish itself or start another activity,
        // then go ahead and add the window.
        boolean willBeVisible = !a.mStartedActivity;
        if (!willBeVisible) {
            willBeVisible = ActivityClient.getInstance().willActivityBeVisible(
                    a.getActivityToken());
        }
        if (r.window == null && !a.mFinished && willBeVisible) {
            r.window = r.activity.getWindow();
            View decor = r.window.getDecorView();
            decor.setVisibility(View.INVISIBLE);
            ViewManager wm = a.getWindowManager();
            WindowManager.LayoutParams l = r.window.getAttributes();
            a.mDecor = decor;
            l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
            l.softInputMode |= forwardBit;
            if (r.mPreserveWindow) {
                a.mWindowAdded = true;
                r.mPreserveWindow = false;
                // Normally the ViewRoot sets up callbacks with the Activity
         // in addView->ViewRootImpl#setView. If we are instead reusing
         // the decor view we have to notify the view root that the
         // callbacks may have changed.
        ViewRootImpl impl = decor.getViewRootImpl();
                if (impl != null) {
                    impl.notifyChildRebuilt();
                }
            }
            if (a.mVisibleFromClient) {
                if (!a.mWindowAdded) {
                    a.mWindowAdded = true;
                    wm.addView(decor, l);
                } else {
                    // The activity will get a callback for this {@link LayoutParams} change
         // earlier. However, at that time the decor will not be set (this is set
         // in this method), so no action will be taken. This call ensures the
         // callback occurs with the decor set.
        a.onWindowAttributesChanged(l);
                }
            }
        
            // If the window has already been added, but during resume
         // we started another activity, then don't yet make the
         // window visible.
        } else if (!willBeVisible) {
            if (localLOGV) Slog.v(TAG, "Launch " + r + " mStartedActivity set");
            r.hideForNow = true;
        }        

    // The window is now visible if it has been added, we are not
    // simply finishing, and we are not starting another activity.
    if (!r.activity.mFinished && willBeVisible && r.activity.mDecor != null && !r.hideForNow) {
        if (localLOGV) Slog.v(TAG, "Resuming " + r + " with isForward=" + isForward);
        ViewRootImpl impl = r.window.getDecorView().getViewRootImpl();
        WindowManager.LayoutParams l = impl != null
                ? impl.mWindowAttributes : r.window.getAttributes();
        ......
    
        r.activity.mVisibleFromServer = true;
        mNumVisibleActivities++;
        if (r.activity.mVisibleFromClient) {
            r.activity.makeVisible();
        }
    }
        
    r.nextIdle = mNewActivities;
    mNewActivities = r;
    if (localLOGV) Slog.v(TAG, "Scheduling idle handler for " + r);
    //这里Idler在消息队列空闲的时候会出发onstop等流程
    Looper.myQueue().addIdleHandler(new Idler());
}        
        

ActivityThread#performResumeActivity

base/core/java/android/app/ActivityThread.java

 public boolean performResumeActivity(ActivityClientRecord r, boolean finalStateRequest,
            String reason) {
        
        if (r.activity.mFinished) {
            // 如果 Activity 已经是finish状态,直接return false
            return false;
        }
        if (r.getLifecycleState() == ON_RESUME) {
            // 如果已经是 Resume 状态 直接return false,避免重复执行
            return false;
        }

        try {
           // ...
           
            // 执行 Activity 的 performResume 进而执行 onResume
            r.activity. performResume(r.startsNotResumed, reason);

            r.state = null;
            r.persistentState = null;
            // 设置 Activity 的状态 为 ON_RESUME
            r.setState(ON_RESUME);

            reportTopResumedActivityChanged(r, r.isTopResumedActivity, "topWhenResuming");
        } catch (Exception e) {
            if (!mInstrumentation.onException(r.activity, e)) {
                throw new RuntimeException("Unable to resume activity "
                        + r.intent.getComponent().toShortString() + ": " + e.toString(), e);
            }
        }
        return true;
    }

performResumeActivity 中先对 Activity 的状态进行了判断,如果状态符合,则会调用 Activity 的 performResume 方法,进而执行 Activity 的 onResume.

Activity#performResume

base/core/java/android/app/Activity.java

final void performResume(boolean followedByPause, String reason) {
    if (Trace.isTagEnabled(Trace.TRACE_TAG_WINDOW_MANAGER)) {
        Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "performResume:"
                + mComponent.getClassName());
    }
    dispatchActivityPreResumed();
    performRestart(true /* start */ , reason);

    ......
    
    // mResumed is set by the instrumentation
mInstrumentation.callActivityOnResume(this);
    EventLogTags.writeWmOnResumeCalled(mIdent, getComponentName().getClassName(), reason);
    if (!mCalled) {
        throw new SuperNotCalledException(
            "Activity " + mComponent.toShortString() +
            " did not call through to super.onResume()");
    }

    // Now really resume, and install the current status bar and menu.
mCalled = false;

    mFragments.dispatchResume();
    mFragments.execPendingActions();

    onPostResume();

    dispatchActivityPostResumed();
    Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
}

Instrumentation#callActivityOnResume

base/core/java/android/app/Instrumentation.java

public void callActivityOnResume(Activity activity) {
    activity.mResumed = true;
    activity.onResume();
    
    if (mActivityMonitors != null) {
        synchronized (mSync) {
            final int N = mActivityMonitors.size();
            for (int i=0; i<N; i++) {
                final ActivityMonitor am = mActivityMonitors.get(i);
                am.match(activity, activity, activity.getIntent());
            }
        }
    }
}

Activity#onResume

base/core/java/android/app/Activity.java

@CallSuper
protected void onResume() {
    if (DEBUG_LIFECYCLE) Slog.v(TAG, "onResume " + this);
    dispatchActivityResumed();
    mActivityTransitionState.onResume(this);
    getAutofillClientController().onActivityResumed();

    notifyContentCaptureManagerIfNeeded(CONTENT_CAPTURE_RESUME);

    mCalled = true;
}

onPause

TaskFragment#resumeTopActivity

新activity被resume之前会先pause之前活动状态的activity。resumeTopActivity会执行两次,第一次调用时会调用pauseBackTasks执行Pause流程。

base/services/core/java/com/android/server/wm/TaskFragment.java

    final boolean resumeTopActivity(ActivityRecord prev, ActivityOptions options,
            boolean deferPause) {
                // 这里的next返回下一个需要显示的Activity
                ActivityRecord next = topRunningActivity(true /* focusableOnly */);  
                ......
                // 重点* 1. 第一次执行走这,执行SourceActivity的pause流程
                boolean pausing = !deferPause && taskDisplayArea.pauseBackTasks(next);
                ......
                if (pausing) {
                    ProtoLog.v(WM_DEBUG_STATES, "resumeTopActivity: Skip resume: need to"+ " start pausing");
                    if (next.attachedToProcess()) {
                        ......
                    } else if (!next.isProcessRunning()) {
                        // 进程没有运行,则触发异步创建进程。
                        final boolean isTop = this == taskDisplayArea.getFocusedRootTask();
                        mAtmService.startProcessAsync(next, false /* knownToBeDead */, isTop,
                            isTop ? HostingRecord.HOSTING_TYPE_NEXT_TOP_ACTIVITY
                                    : HostingRecord.HOSTING_TYPE_NEXT_ACTIVITY);
                    }
                    ......
                    // 注意,这里会return,所以第一次执行到这就结束了。
                    return true;
                }
                ......
                ProtoLog.d(WM_DEBUG_STATES, "resumeTopActivity: Restarting %s", next);
                // 重点*2. 第二次执行的时候走这,SourceActivity已经执行完pause流程了,所以走这启动Activity走这
                mTaskSupervisor.startSpecificActivity(next, true, true); 
            }

TaskDisplayArea#pauseBackTasks

遍历所有叶子task,执行startPausing方法。

base/services/core/java/com/android/server/wm/TaskDisplayArea.java

boolean pauseBackTasks(ActivityRecord resuming) {
    final int[] someActivityPaused = {0};
    forAllLeafTasks(leafTask -> {
        // Check if the direct child resumed activity in the leaf task needed to be paused if
 // the leaf task is not a leaf task fragment.
if (!leafTask.isLeafTaskFragment()) {
            final ActivityRecord top = topRunningActivity();
            final ActivityRecord resumedActivity = leafTask.getResumedActivity();
            if (resumedActivity != null && top.getTaskFragment() != leafTask) {
                // Pausing the resumed activity because it is occluded by other task fragment.
if (leafTask.startPausing(false /* uiSleeping*/ , resuming, "pauseBackTasks")) {
                    someActivityPaused[0]++;
                }
            }
        }

        leafTask.forAllLeafTaskFragments((taskFrag) -> {
            final ActivityRecord resumedActivity = taskFrag.getResumedActivity();
            if (resumedActivity != null && !taskFrag.canBeResumed(resuming)) {
                if (taskFrag.startPausing(false /* uiSleeping*/ , resuming, "pauseBackTasks")) {
                    someActivityPaused[0]++;
                }
            }
        }, true /* traverseTopToBottom */ );
    }, true /* traverseTopToBottom */ );
    return someActivityPaused[0] > 0;
}

TaskFragment#startPausing

调用schedulePauseActivity方法继续执行pause流程。

base/services/core/java/com/android/server/wm/TaskFragment.java

/**
* Start pausing the currently resumed activity.  It is an error to call this if there
* is already an activity being paused or there is no resumed activity.
*/
boolean startPausing(boolean userLeaving, boolean uiSleeping, ActivityRecord resuming,
        String reason) {

            ......
            if (prev.attachedToProcess()) {
                if (shouldAutoPip) {
                    //pip模式
                } else {
                    schedulePauseActivity(prev, userLeaving, pauseImmediately,
                            false /* autoEnteringPip */ , reason);
                }
            } else {
                mPausingActivity = null;
                mLastPausedActivity = null;
                mTaskSupervisor.mNoHistoryActivities.remove(prev);
            }
            
            ......        
        
        }

TaskFragment#schedulePauseActivity

在schedulePauseActivity方法中会构造PauseActivityItem,发送给具体APP进程执行pause流程。

base/services/core/java/com/android/server/wm/TaskFragment.java

    void schedulePauseActivity(ActivityRecord prev, boolean userLeaving,
            boolean pauseImmediately, String reason) {

        try {
            
            EventLogTags.writeWmPauseActivity(prev.mUserId, System.identityHashCode(prev),
                    prev.shortComponentName, "userLeaving=" + userLeaving, reason);
            
            mAtmService.getLifecycleManager().scheduleTransaction(prev.app.getThread(),
                    prev.token, PauseActivityItem.obtain(prev.finishing, userLeaving,
                            prev.configChangeFlags, pauseImmediately));
        } catch (Exception e) {
            ......
        }
    }

PauseActivityItem#execute

base/core/java/android/app/servertransaction/PauseActivityItem.java

@Override
public void execute(ClientTransactionHandler client, ActivityClientRecord r,
        PendingTransactionActions pendingActions) {
    Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityPause");
    client.handlePauseActivity(r, mFinished, mUserLeaving, mConfigChanges, mAutoEnteringPip,
            pendingActions, "PAUSE_ACTIVITY_ITEM");
    Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
}

这里和之前的生命周期走的流程是一样的,通过TransactionExecutor的performLifecycleSequence方法调用handlePauseActivity方法。

ActivityThread#handlePauseActivity

base/core/java/android/app/ActivityThread.java

@Override
public void handlePauseActivity(ActivityClientRecord r, boolean finished, boolean userLeaving,
        int configChanges, boolean autoEnteringPip, PendingTransactionActions pendingActions,
        String reason) {
    if (userLeaving) {
        performUserLeavingActivity(r);
    }

    r.activity.mConfigChangeFlags |= configChanges;
    if (autoEnteringPip) {
        // Set mIsInPictureInPictureMode earlier in case of auto-enter-pip, see also
 // {@link Activity#enterPictureInPictureMode(PictureInPictureParams)}.
r.activity.mIsInPictureInPictureMode = true;
    }
    performPauseActivity(r, finished, reason, pendingActions);

    mSomeActivitiesChanged = true;
}
后续流程与其他生命周期处理流程相同:

ActivityThread::handlePauseActivity
    ActivityThread::performPauseActivity
        ActivityThread::performPauseActivityIfNeeded
            Instrumentation::callActivityOnPause
                Activity::performPause
                    Activity::onPause    -- onPause
        ActivityClientRecord::setState   -- 设置状态ON_PAUSE

Activity#performPause

base/core/java/android/app/Activity.java

final void performPause() {
    if (Trace.isTagEnabled(Trace.TRACE_TAG_WINDOW_MANAGER)) {
        Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "performPause:"
                + mComponent.getClassName());
    }
    dispatchActivityPrePaused();
    mDoReportFullyDrawn = false;
    mFragments.dispatchPause();
    mCalled = false;
    onPause();
    EventLogTags.writeWmOnPausedCalled(mIdent, getComponentName().getClassName(),
            "performPause");
    mResumed = false;

    dispatchActivityPostPaused();
    Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
}

Activity#onPause

base/core/java/android/app/Activity.java

@CallSuper
protected void onPause() {
    if (DEBUG_LIFECYCLE) Slog.v(TAG, "onPause " + this);
    dispatchActivityPaused();
    getAutofillClientController().onActivityPaused();

    notifyContentCaptureManagerIfNeeded(CONTENT_CAPTURE_PAUSE);
    mCalled = true;
}

onStop

Android的普遍策略是优先处理用户感知的流程,而像onStop/onDestroy等用户感知不明显的流程则会选择在系统空闲时进行处理,当然其中会有超时机制确保执行。

ActivityThread#handleResumeActivity

在目标Activity进入前台时会往消息队列中注册一个IdleHandler,当消息队列空闲时便会处理其中的流程。

base/core/java/android/app/ActivityThread.java

@Override
public void handleResumeActivity(ActivityClientRecord r, boolean finalStateRequest,
        boolean isForward, String reason) {

        ......
        wm.addView(decor, l);
        ...... 
        r.nextIdle = mNewActivities;
        mNewActivities = r;
        if (localLOGV) Slog.v(TAG, "Scheduling idle handler for " + r);
        Looper.myQueue().addIdleHandler(new Idler());
}        
        

ActivityThread#Idler

base/core/java/android/app/ActivityThread.java

private class Idler implements MessageQueue.IdleHandler {
    @Override
    public final boolean queueIdle() {
        ActivityClientRecord a = mNewActivities;
        boolean stopProfiling = false;
        if (mBoundApplication != null && mProfiler.profileFd != null
                && mProfiler.autoStopProfiler) {
            stopProfiling = true;
        }
        if (a != null) {
            mNewActivities = null;
            final ActivityClient ac = ActivityClient.getInstance();
            ActivityClientRecord prev;
            do {
                if (localLOGV) Slog.v(
                    TAG, "Reporting idle of " + a +
                    " finished=" +
                    (a.activity != null && a.activity.mFinished));
                if (a.activity != null && !a.activity.mFinished) {
                    ac.activityIdle(a.token, a.createdConfig, stopProfiling);
                    a.createdConfig = null;
                }
                prev = a;
                a = a.nextIdle;
                prev.nextIdle = null;
            } while (a != null);
        }
        if (stopProfiling) {
            mProfiler.stopProfiling();
        }
        return false;
    }
}

ActivityClient#activityIdle

目标activity进入前台之后,报告主线程已经处于空闲状态。

base/core/java/android/app/ActivityClient.java

/** Reports the main thread is idle after the activity is resumed. */
public void activityIdle(IBinder token, Configuration config, boolean stopProfiling) {
    try {
        getActivityClientController().activityIdle(token, config, stopProfiling);
    } catch (RemoteException e) {
        e.rethrowFromSystemServer();
    }
}

ActivityClientController#activityIdle

base/services/core/java/com/android/server/wm/ActivityClientController.java

@Override
public void activityIdle(IBinder token, Configuration config, boolean stopProfiling) {
    final long origId = Binder.clearCallingIdentity();
    try {
        synchronized (mGlobalLock) {
            Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "activityIdle");
            final ActivityRecord r = ActivityRecord.forTokenLocked(token);
            if (r == null) {
                return;
            }
            mTaskSupervisor.activityIdleInternal(r, false /* fromTimeout */ ,
                    false /* processPausingActivities */ , config);
            if (stopProfiling && r.hasProcess()) {
                r.app.clearProfilerIfNeeded();
            }
        }
    } finally {
        Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
        Binder.restoreCallingIdentity(origId);
    }
}

ActivityTaskSupervisor#activityIdleInternal

base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java

void activityIdleInternal(ActivityRecord r, boolean fromTimeout,
        boolean processPausingActivities, Configuration config) {
    if (DEBUG_ALL) Slog.v(TAG, "Activity idle: " + r);
    
    if (r != null) {
        if (DEBUG_IDLE) Slog.d(TAG_IDLE, "activityIdleInternal: Callers="
                + Debug.getCallers(4));
        mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
        r.finishLaunchTickingLocked();
        ......
        // We are now idle.  If someone is waiting for a thumbnail from
     // us, we can now deliver.
    r.idle = true;
        ......
        // When activity is idle, we consider the relaunch must be successful, so let's clear
     // the flag.
    r.mRelaunchReason = RELAUNCH_REASON_NONE;
    } 
    
    
    // Atomically retrieve all of the other things to do.
    processStoppingAndFinishingActivities(r, processPausingActivities, "idle");
    .......
    mService.mH.post(() -> mService.mAmInternal.trimApplications());    
    }
    

ActivityTaskSupervisor#processStoppingAndFinishingActivities

只有在前台activity处于空闲状态才会调用此方法执行后台应用的stop或者destroy流程。

base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java

/**
* Processes the activities to be stopped or destroyed. This should be called when the resumed
* activities are idle or drawn.
*/
private void processStoppingAndFinishingActivities(ActivityRecord launchedActivity,
        boolean processPausingActivities, String reason) {
         // Stop any activities that are scheduled to do so but have been waiting for the transition
        // animation to finish.
        ArrayList<ActivityRecord> readyToStopActivities = null;
        for (int i = mStoppingActivities.size() - 1; i >= 0; --i) {
            final ActivityRecord s = mStoppingActivities.get(i);
            final boolean animating = s.isInTransition();
            ProtoLog.v(WM_DEBUG_STATES, "Stopping %s: nowVisible=%b animating=%b "
                    + "finishing=%s", s, s.nowVisible, animating, s.finishing);
            if (!animating || mService.mShuttingDown) {
                if (!processPausingActivities && s.isState(PAUSING)) {
                    // Defer processing pausing activities in this iteration and reschedule
         // a delayed idle to reprocess it again
        removeIdleTimeoutForActivity(launchedActivity);
                    scheduleIdleTimeout(launchedActivity);
                    continue;
                }
        
                ProtoLog.v(WM_DEBUG_STATES, "Ready to stop: %s", s);
                if (readyToStopActivities == null) {
                    readyToStopActivities = new ArrayList<>();
                }
                readyToStopActivities.add(s);
        
                mStoppingActivities.remove(i);
            }
        }
        
        final int numReadyStops = readyToStopActivities == null ? 0 : readyToStopActivities.size();
        for (int i = 0; i < numReadyStops; i++) {
            final ActivityRecord r = readyToStopActivities.get(i);
            if (r.isInHistory()) {
                if (r.finishing) {
                    // TODO(b/137329632): Wait for idle of the right activity, not just any.
        r.destroyIfPossible(reason);
                } else {
                    r.stopIfPossible();
                }
            }
        }
        
        final int numFinishingActivities = mFinishingActivities.size();
        if (numFinishingActivities == 0) {
            return;
        }
        
        // Finish any activities that are scheduled to do so but have been waiting for the next one
        // to start.
        final ArrayList<ActivityRecord> finishingActivities = new ArrayList<>(mFinishingActivities);
        mFinishingActivities.clear();
        for (int i = 0; i < numFinishingActivities; i++) {
            final ActivityRecord r = finishingActivities.get(i);
            if (r.isInHistory()) {
                r.destroyImmediately("finish-" + reason);
            }
        }       
   }

ActivityRecord#stopIfPossible

在ActivityRecord的stopIfPossible方法中会初始化StopActivityItem,执行最终的stop流程。同时会发送stop超时检测消息,确保最终执行onstop流程。

base/services/core/java/com/android/server/wm/ActivityRecord.java

void stopIfPossible() {
    ......
    try {
        stopped = false;
        ProtoLog.v(WM_DEBUG_STATES, "Moving to STOPPING: %s (stop requested)", this);
    
        setState(STOPPING, "stopIfPossible");
        if (DEBUG_VISIBILITY) {
            Slog.v(TAG_VISIBILITY, "Stopping:" + this);
        }
        EventLogTags.writeWmStopActivity(
                mUserId, System.identityHashCode(this), shortComponentName);
        mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), token,
                StopActivityItem.obtain(configChangeFlags));
    
        mAtmService.mH.postDelayed(mStopTimeoutRunnable, STOP_TIMEOUT);
    } catch (Exception e) {
    
    }

}

StopActivityItem#execute

当StopActivityItem被执行的时候会调用客户端ActivityThread的handleStopActivity方法。

base/core/java/android/app/servertransaction/StopActivityItem.java

@Override
public void execute(ClientTransactionHandler client, ActivityClientRecord r,
        PendingTransactionActions pendingActions) {
    Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStop");
    client.handleStopActivity(r, mConfigChanges, pendingActions,
            true /* finalStateRequest */ , "STOP_ACTIVITY_ITEM");
    Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
}

ActivityThread#handleStopActivity

base/core/java/android/app/ActivityThread.java

@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;
}

ActivityThread#performStopActivityInner

base/core/java/android/app/ActivityThread.java
/**
* Core implementation of stopping an activity.
* @param r Target activity client record.
* @param info Action that will report activity stop to server.
* @param saveState Flag indicating whether the activity state should be saved.
* @param finalStateRequest Flag indicating if this call is handling final lifecycle state
*                          request for a transaction.
* @param reason Reason for performing this operation.
*/
private void performStopActivityInner(ActivityClientRecord r, StopInfo info,
        boolean saveState, boolean finalStateRequest, String reason) {
        ...
       // One must first be paused before stopped...
        performPauseActivityIfNeeded(r, reason);
        ...
        callActivityOnStop(r, saveState, reason);
        ...
     }   

ActivityThread#callActivityOnStop

在callActivityOnStop方法中还会调用Activity的OnSaveInstanceState方法进行相关参数的保存。

在Android P之前是onSaveInstanceState方法是在onStop之前回调的,从Android P开始onSaveInstanceState方法是在onStop之后回调的。


/**
* Calls { @link Activity#onStop()} and { @link Activity#onSaveInstanceState(Bundle)}, and updates
* the client record's state.
* All calls to stop an activity must be done through this method to make sure that
* { @link Activity#onSaveInstanceState(Bundle)} is also executed in the same call.
*/
private void callActivityOnStop(ActivityClientRecord r, boolean saveState, String reason) {
     // Before P onSaveInstanceState was called before onStop, starting with P it's
     // called after. Before Honeycomb state was always saved before onPause. 
    final boolean shouldSaveState = saveState && !r.activity.mFinished && r.state == null
            && !r.isPreHoneycomb();
    final boolean isPreP = r.isPreP();
    if (shouldSaveState && isPreP) {
        callActivityOnSaveInstanceState(r);
    }

    try {
        r.activity.performStop(r.mPreserveWindow, reason);
    } catch (SuperNotCalledException e) {
        throw e;
    } catch (Exception e) {
        ......
    }
    r.setState(ON_STOP);
    
    if (shouldSaveState && !isPreP) {
        callActivityOnSaveInstanceState(r);
    }
}

Activity#performStop

base/core/java/android/app/Activity.java

final void performStop(boolean preserveWindow, String reason) {
    if (Trace.isTagEnabled(Trace.TRACE_TAG_WINDOW_MANAGER)) {
        Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "performStop:"
                + mComponent.getClassName());
    }
    mDoReportFullyDrawn = false;
    mFragments.doLoaderStop(mChangingConfigurations /*retain*/ );

    // Disallow entering picture-in-picture after the activity has been stopped
mCanEnterPictureInPicture = false;

    if (!mStopped) {
        dispatchActivityPreStopped();
        if (mWindow != null) {
            mWindow.closeAllPanels();
        }

        // If we're preserving the window, don't setStoppedState to true, since we
 // need the window started immediately again. Stopping the window will
 // destroys hardware resources and causes flicker.
if (!preserveWindow && mToken != null && mParent == null) {
            WindowManagerGlobal.getInstance().setStoppedState(mToken, true);
        }

        mFragments.dispatchStop();

        mCalled = false;
        mInstrumentation.callActivityOnStop(this);
        EventLogTags.writeWmOnStopCalled(mIdent, getComponentName().getClassName(), reason);

        ...

        mStopped = true;
        dispatchActivityPostStopped();
    }
    mResumed = false;
    Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
}

Instrumentation#callActivityOnStop

base/core/java/android/app/Instrumentation.java

public void callActivityOnStop(Activity activity) {
    activity.onStop();
}

Activity#onStop

base/core/java/android/app/Activity.java

/**
* Called when you are no longer visible to the user.  You will next
* receive either { @link #onRestart}, { @link #onDestroy}, or nothing,
* depending on later user activity. This is a good place to stop
* refreshing UI, running animations and other visual things.
*
* <p><em>Derived classes must call through to the super class's
* implementation of this method.  If they do not, an exception will be
* thrown.</em></p>
*/
@CallSuper
protected void onStop() {
    if (DEBUG_LIFECYCLE) Slog.v(TAG, "onStop " + this);
    if (mActionBar != null) mActionBar.setShowHideAnimationEnabled(false);
    mActivityTransitionState.onStop(this);
    dispatchActivityStopped();
    mTranslucentCallback = null;
    mCalled = true;

    getAutofillClientController().onActivityStopped(mIntent, mChangingConfigurations);
    mEnterAnimationComplete = false;
}


private void dispatchActivityStopped() {
    Object[] callbacks = collectActivityLifecycleCallbacks();
    if (callbacks != null) {
        for (int i = callbacks.length - 1; i >= 0; i--) {
            ((Application.ActivityLifecycleCallbacks) callbacks[i]).onActivityStopped(this);
        }
    }
    getApplication().dispatchActivityStopped(this);
}

onDestroy

同onStop流程,执行到ActivityTaskSupervisor#processStoppingAndFinishingActivities的方法会执行destroyIfPossible方法来执行destroy流程。

ActivityRecord#destroyImmediately

destroyImmediately的调用点有很多,对应不同的reason。在ActivityRecord的destroyImmediately方法中会初始化DestroyActivityItem,执行最终的destroy流程。

base/services/core/java/com/android/server/wm/ActivityRecord.java

boolean destroyImmediately(String reason) {
    if (DEBUG_SWITCH || DEBUG_CLEANUP) {
        Slog.v(TAG_SWITCH, "Removing activity from " + reason + ": token=" + this
                + ", app=" + (hasProcess() ? app.mName : "(null)"));
    }

    if (isState(DESTROYING, DESTROYED)) {
        ProtoLog.v(WM_DEBUG_STATES, "activity %s already destroying, skipping "
                + "request with reason:%s", this, reason);
        return false;
    }

    EventLogTags.writeWmDestroyActivity(mUserId, System.identityHashCode(this),
            task.mTaskId, shortComponentName, reason);

    boolean removedFromHistory = false;

    cleanUp(false /* cleanServices */ , false /* setState */ );

    if (hasProcess()) {
        app.removeActivity(this, true /* keepAssociation */ );
        if (!app.hasActivities()) {
            mAtmService.clearHeavyWeightProcessIfEquals(app);
        }

        boolean skipDestroy = false;

        try {
            if (DEBUG_SWITCH) Slog.i(TAG_SWITCH, "Destroying: " + this);
            mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), token,
                    DestroyActivityItem.obtain(finishing, configChangeFlags));
        } catch (Exception e) {
            ...
        }

        nowVisible = false;

        // If the activity is finishing, we need to wait on removing it from the list to give it
 // a chance to do its cleanup.  During that time it may make calls back with its token
 // so we need to be able to find it on the list and so we don't want to remove it from
 // the list yet.  Otherwise, we can just immediately put it in the destroyed state since
 // we are not removing it from the list.
if (finishing && !skipDestroy) {
            ProtoLog.v(WM_DEBUG_STATES, "Moving to DESTROYING: %s (destroy requested)", this);
            setState(DESTROYING,
                    "destroyActivityLocked. finishing and not skipping destroy");
            mAtmService.mH.postDelayed(mDestroyTimeoutRunnable, DESTROY_TIMEOUT);
        } else {
            ProtoLog.v(WM_DEBUG_STATES, "Moving to DESTROYED: %s "
                    + "(destroy skipped)", this);
            setState(DESTROYED,
                    "destroyActivityLocked. not finishing or skipping destroy");
            if (DEBUG_APP) Slog.v(TAG_APP, "Clearing app during destroy for activity " + this);
            detachFromProcess();
        }
    } else {
        // Remove this record from the history.
if (finishing) {
            removeFromHistory(reason + " hadNoApp");
            removedFromHistory = true;
        } else {
            ProtoLog.v(WM_DEBUG_STATES, "Moving to DESTROYED: %s (no app)", this);
            setState(DESTROYED, "destroyActivityLocked. not finishing and had no app");
        }
    }

    configChangeFlags = 0;

    return removedFromHistory;
}

DestroyActivityItem#execute

当DestroyActivityItem被执行的时候会调用客户端ActivityThread的handleDestroyActivity方法。

base/core/java/android/app/servertransaction/DestroyActivityItem.java

public void execute(ClientTransactionHandler client, ActivityClientRecord r,
        PendingTransactionActions pendingActions) {
    Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityDestroy");
    client.handleDestroyActivity(r, mFinished, mConfigChanges,
            false /* getNonConfigInstance */ , "DestroyActivityItem");
    Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
}

ActivityThread#handleDestroyActivity

base/core/java/android/app/ActivityThread.java

@Override
public void handleDestroyActivity(ActivityClientRecord r, boolean finishing, int configChanges,
        boolean getNonConfigInstance, String reason) {
    performDestroyActivity(r, finishing, configChanges, getNonConfigInstance, reason);
    cleanUpPendingRemoveWindows(r, finishing);
    WindowManager wm = r.activity.getWindowManager();
    View v = r.activity.mDecor;
    if (v != null) {
        if (r.activity.mVisibleFromServer) {
            mNumVisibleActivities--;
        }
        IBinder wtoken = v.getWindowToken();
        if (r.activity.mWindowAdded) {
            if (r.mPreserveWindow) {
                ......
            } else {
                final ViewRootImpl viewRoot = v.getViewRootImpl();
                if (viewRoot != null) {
                    // Clear callbacks to avoid the destroyed activity from receiving
 // configuration or camera compat changes that are no longer effective.
viewRoot.setActivityConfigCallback(null);
                }
                wm.removeViewImmediate(v);
            }
        }
          ......
        r.activity.mDecor = null;
    }
    ......
    if (finishing) {
        ActivityClient.getInstance().activityDestroyed(r.token);
    }
    
}

ActivityThread#performDestroyActivity

base/core/java/android/app/ActivityThread.java

/** Core implementation of activity destroy call. */
void performDestroyActivity(ActivityClientRecord r, boolean finishing,
        int configChanges, boolean getNonConfigInstance, String reason) {
    Class<? extends Activity> activityClass = null;
    if (localLOGV) Slog.v(TAG, "Performing finish of " + r);
    activityClass = r.activity.getClass();
    r.activity.mConfigChangeFlags |= configChanges;
    if (finishing) {
        r.activity.mFinished = true;
    }

    //再次确认是否已经stop状态
    performPauseActivityIfNeeded(r, "destroy");

    if (!r.stopped) {
        callActivityOnStop(r, false /* saveState */ , "destroy");
    }
    ......
    try {
        r.activity.mCalled = false;
        //回调OnDestroy
        mInstrumentation.callActivityOnDestroy(r.activity);
        if (!r.activity.mCalled) {
            throw new SuperNotCalledException("Activity " + safeToComponentShortString(r.intent)
                    + " did not call through to super.onDestroy()");
        }
        if (r.window != null) {
            r.window.closeAllPanels();
        }
    } catch (SuperNotCalledException e) {
        throw e;
    } catch (Exception e) {
        ......
    }
    r.setState(ON_DESTROY);
    //其他资源清理操作

}

在Instrumentation中调用callActivityOnDestroy方法,会直接调用Activity的performDestroy方法。

Activity#performDestroy

base/core/java/android/app/Activity.java

final void performDestroy() {
    if (Trace.isTagEnabled(Trace.TRACE_TAG_WINDOW_MANAGER)) {
        Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "performDestroy:"
                + mComponent.getClassName());
    }
    dispatchActivityPreDestroyed();
    mDestroyed = true;
    mWindow.destroy();
    mFragments.dispatchDestroy();
    //回调onDestroy方法
    onDestroy();
    //打印event log
    EventLogTags.writeWmOnDestroyCalled(mIdent, getComponentName().getClassName(),
            "performDestroy");
    mFragments.doLoaderDestroy();
    if (mVoiceInteractor != null) {
        mVoiceInteractor.detachActivity();
    }
    dispatchActivityPostDestroyed();
    Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
}

Activity#onDestroy

此 activity 生命周期结束,清理资源。

base/core/java/android/app/Activity.java

@CallSuper
protected void onDestroy() {
    if (DEBUG_LIFECYCLE) Slog.v(TAG, "onDestroy " + this);
    mCalled = true;

    getAutofillClientController().onActivityDestroyed();

    // dismiss any dialogs we are managing.
if (mManagedDialogs != null) {
        final int numDialogs = mManagedDialogs.size();
        for (int i = 0; i < numDialogs; i++) {
            final ManagedDialog md = mManagedDialogs.valueAt(i);
            if (md.mDialog.isShowing()) {
                md.mDialog.dismiss();
            }
        }
        mManagedDialogs = null;
    }

    // close any cursors we are managing.
synchronized (mManagedCursors) {
        int numCursors = mManagedCursors.size();
        for (int i = 0; i < numCursors; i++) {
            ManagedCursor c = mManagedCursors.get(i);
            if (c != null) {
                c.mCursor.close();
            }
        }
        mManagedCursors.clear();
    }

    // Close any open search dialog
if (mSearchManager != null) {
        mSearchManager.stopSearch();
    }

    if (mActionBar != null) {
        mActionBar.onDestroy();
    }

    dispatchActivityDestroyed();

    notifyContentCaptureManagerIfNeeded(CONTENT_CAPTURE_STOP);

    if (mUiTranslationController != null) {
        mUiTranslationController.onActivityDestroyed();
    }
    if (mDefaultBackCallback != null) {
        getOnBackInvokedDispatcher().unregisterOnBackInvokedCallback(mDefaultBackCallback);
        mDefaultBackCallback = null;
    }
    if (mCallbacksController != null) {
        mCallbacksController.clearCallbacks();
    }
}

ActivityLifecycleCallback

从 Android API 14之后的Application类中,增加一个应用生命周期回调的注册方法registerActivityLifecycleCallbacks,用来对应用的Activity的生命周期进行集中管理。

在Activity的每个生命周期执行之后都会执行对应生命周期的回调接口。

base/core/java/android/app/Activity.java

@UiContext
public class Activity extends ContextThemeWrapper
        implements LayoutInflater.Factory2,
        Window.Callback, KeyEvent.Callback,
        OnCreateContextMenuListener, ComponentCallbacks2,
        Window.OnWindowDismissedCallback,
        ContentCaptureManager.ContentCaptureClient {

@MainThread
@CallSuper
protected void onCreate(@Nullable Bundle savedInstanceState) {
    if (DEBUG_LIFECYCLE) Slog.v(TAG, "onCreate " + this + ": " + savedInstanceState);
        ......
        dispatchActivityCreated(savedInstanceState);
        ......
    }
    
    @CallSuper
    protected void onStart() {
        if (DEBUG_LIFECYCLE) Slog.v(TAG, "onStart " + this);
        ......
        dispatchActivityStarted();
        ......
    }

    @CallSuper
    protected void onStop() {
        if (DEBUG_LIFECYCLE) Slog.v(TAG, "onStop " + this);
        ......
        dispatchActivityStopped();
        ......
    }
    
    //其他生命周期相同,不再一一列举
    ......
}

在Application中可以注册ActivityLifecycleCallbacks接口统一监听应用中activity的生命周期:


registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
        
    }

    @Override
    public void onActivityStarted(Activity activity) {

    }

    @Override
    public void onActivityResumed(Activity activity) {

    }

    @Override
    public void onActivityPaused(Activity activity) {

    }

    @Override
    public void onActivityStopped(Activity activity) {

    }

    @Override
    public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

    }

    @Override
    public void onActivityDestroyed(Activity activity) {

    }
});