ActivityManagerService-B Activity状态改变

版权说明:本文为 开开向前冲 原创文章,转载请注明出处;
注:限于作者水平有限,文中有不对的地方还请指教

很多大神都讲解过AMS是如何管理Activity,我也通过看他们的博客学习了很多,大多数文章通过讲解Activity 的启动过程来说明这个过程,本文根据以ActivityState的切换为主线来说明AMS 是如何管理Activity;

ActivityState

《ActivityManagerService-B Activity状态改变》 ActivityState.jpg

------> frameworks\base\services\core\java\com\android\server\am\ActivityStack.java
    enum ActivityState {
        INITIALIZING,
        RESUMED,
        PAUSING,
        PAUSED,
        STOPPING,
        STOPPED,
        FINISHING,
        DESTROYING,
        DESTROYED
    }

Activity在生命周期内肯定处于上述状态中的一种;Activity 状态的切换也是AMS管理Activity的一个体现;

1. 初始状态 INITIALIZING

Activity 最初始的状态就是 INITIALIZING,INITIALIZING 字面值代表初始化,那 ActivityRecord 会在什么时候被初始化呢?初始化一般发生在构造这个对象的时候,进入ActivityRecord 的构造方法,有如下:

    ActivityRecord(......) {
        ......
        state = ActivityState.INITIALIZING; //初始化状态
        ......
    }

ActivityRecord 的state对象代表着ActivityRecord的各种状态;现在的问题变成ActivityRecord在什么时候会被初始化呢?看过startActivity流程源码的应该都知道ActivityRecord会在ActivityStackSupervisor的startActivityLocked方法中被初始化;

------> ActivityStackSupervisor.java
   final int startActivityLocked(IApplicationThread caller,
            Intent intent, String resolvedType, ActivityInfo aInfo,
            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
            IBinder resultTo, String resultWho, int requestCode,
            int callingPid, int callingUid, String callingPackage,
            int realCallingPid, int realCallingUid, int startFlags, Bundle options,
            boolean componentSpecified, ActivityRecord[] outActivity, ActivityContainer container,
            TaskRecord inTask) {
        ......
                ActivityRecord r = new ActivityRecord(mService, callerApp, callingUid, callingPackage,
                intent, resolvedType, aInfo, mService.mConfiguration, resultRecord, resultWho,
                requestCode, componentSpecified, this, container, options);
        ......
    }

跟踪startActivityLocked的调用栈就知道它的源头是在ContextImpl.java的startActivity,即平时启动Activity时调用的startActivity()方法;即 ActivityRecord会在startActivity过程中被初始化;这很符合逻辑,不管以什么方式打开应用Activity,都会走到 startActivityLocked,这里会初始化一个ActivityRecord 对象代表新启动的Activity,AMS 通过管理这个ActivityRecord对象来管理Activity的生命周期;

2. 持续状态 RESUMED

RESUMED 状态代表该Activity 处于可见状态,说明AMS已经调整好ActivityRecord的状态,可以向用户显示;RESUMED 是在ActivityStack.java的resumeTopActivityInnerLocked方法中设置:

------> ActivityStack.java
  final boolean resumeTopActivityInnerLocked(ActivityRecord prev, Bundle options) {
    ......
        if (next.app != null && next.app.thread != null) {
            ......
            ActivityState lastState = next.state;
            mService.updateCpuStats();
            if (DEBUG_STATES) Slog.v(TAG, "Moving to RESUMED: " + next + " (in existing)");
            next.state = ActivityState.RESUMED;//设置状态为 RESUMED
            mResumedActivity = next;
            next.task.touchActiveTime();
            mService.addRecentTaskLocked(next.task);
            mService.updateLruProcessLocked(next.app, true, null);
            updateLRUListLocked(next);
            mService.updateOomAdjLocked();
            ......
        }
    ......
  }

resumeTopActivityInnerLocked 方法会在startActivity过程中被调用,该方法会根据需要启动的Activity所在进程是否已经启动执行不同操作;

3. 暂停状态 PAUSING —> PAUSED

Activity 从可交互状态到不可交互状态需要一个过渡期,这个过渡期就是PAUSING 状态,PAUSING 后Activity会进入PAUSED状态,代表该Activity 处于正在暂停的过程,说明AMS 正在调整Activity 状态,使其不再和用户交互;在启动新Activity的时候,会先暂停目前处于RESUMED状态的Activity,此时会回调两个应用的Lifecycle方法,Lifecycle 方法是AMS 通过回调ActivityThread中ApplicationThread的方法来调用(此时ActivityThread为Server,AMS为Client);

《ActivityManagerService-B Activity状态改变》 ApplicationThread-schedule.png

------> ActivityStack.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.
     *
     * @param userLeaving True if this should result in an onUserLeaving to the current activity.
     * @param uiSleeping True if this is happening with the user interface going to sleep (the
     * screen turning off).
     * @param resuming True if this is being called as part of resuming the top activity, so
     * we shouldn't try to instigate a resume here.
     * @param dontWait True if the caller does not want to wait for the pause to complete.  If
     * set to true, we will immediately complete the pause here before returning.
     * @return Returns true if an activity now is in the PAUSING state, and we are waiting for
     * it to tell us when it is done.
     */
    final boolean startPausingLocked(boolean userLeaving, boolean uiSleeping, boolean resuming,
            boolean dontWait) {
        ActivityRecord prev = mResumedActivity;//将正处于RESUMED状态的Activity标记为prev(A->B,A的从RESUMED->PAUSING)
        mResumedActivity = null;
        mPausingActivity = prev;//启动新Activity的Activity将处于mPausingActivity状态
        mLastPausedActivity = prev;
        prev.state = ActivityState.PAUSING;//设置状态为PAUSING
        prev.task.touchActiveTime();
        if (prev.app != null && prev.app.thread != null) {
            if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending pause: " + prev);
            try {
            
                prev.app.thread.schedulePauseActivity(prev.appToken, prev.finishing,
                        userLeaving, prev.configChangeFlags, dontWait);//调用Activity LifeCycle的onPause方法
            } 
        } else {
            mPausingActivity = null;
            mLastPausedActivity = null;
            mLastNoHistoryActivity = null;
        }
        if (mPausingActivity != null) {
            if (dontWait) {
                // If the caller said they don't want to wait for the pause, then complete
                // the pause now.
                completePauseLocked(false);//设置Activity状态为PAUSED
                return false;

            } else {
                // Schedule a pause timeout in case the app doesn't respond.
                // We don't give it much time because this directly impacts the
                // responsiveness seen by the user.
                Message msg = mHandler.obtainMessage(PAUSE_TIMEOUT_MSG);
                msg.obj = prev;
                prev.pauseTime = SystemClock.uptimeMillis();
                mHandler.sendMessageDelayed(msg, PAUSE_TIMEOUT);
                return true;
            }

        } else {
            // This activity failed to schedule the
            // pause, so just treat it as being paused now.
            if (DEBUG_PAUSE) Slog.v(TAG, "Activity not running, resuming next.");
            if (!resuming) {
                mStackSupervisor.getFocusedStack().resumeTopActivityLocked(null);//会重新进入设置状态为PAUSED
            }
            return false;
        }
    }

private void completePauseLocked(boolean resumeNext) {
        ActivityRecord prev = mPausingActivity;
        if (prev != null) {
            prev.state = ActivityState.PAUSED; //设置前一个Activity的状态为 PAUSED
            ......
        }
       ......
        // Notfiy when the task stack has changed
        mService.notifyTaskStackChangedLocked();
    }

4. 停止状态 STOPPING —> STOPPED

STOPPING —> STOPPED 代表Activity停止的过程和状态;对应过程Activity LifeCycle的onStop() 方法会被回调;

    final void stopActivityLocked(ActivityRecord r) {
        ......
        if (r.app != null && r.app.thread != null) {
            adjustFocusedActivityLocked(r, "stopActivity");
            r.resumeKeyDispatchingLocked();
            try {
                r.stopped = false;
                if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPING: " + r
                        + " (stop requested)");
                r.state = ActivityState.STOPPING;//设置前一个Activity 的状态为STOPPING
                Log.d(TAG + "STOPPING", Log.getStackTraceString(new Throwable()));//keiven-chen
                if (!r.visible) {
                    mWindowManager.setAppVisibility(r.appToken, false);
                }
                r.app.thread.scheduleStopActivity(r.appToken, r.visible, r.configChangeFlags);//回调Activity LifeCycle的onStop()方法
                if (mService.isSleepingOrShuttingDown()) {
                    r.setSleeping(true);
                }
                Message msg = mHandler.obtainMessage(STOP_TIMEOUT_MSG, r);
                mHandler.sendMessageDelayed(msg, STOP_TIMEOUT);
            } catch (Exception e) {
                // Maybe just ignore exceptions here...  if the process
                // has crashed, our death notification will clean things
                // up.
                Slog.w(TAG, "Exception thrown during pause", e);
                // Just in case, assume it to be stopped.
                r.stopped = true;
                r.state = ActivityState.STOPPED;
                Log.d(TAG+"STOPPED",Log.getStackTraceString(new Throwable()));//Keiven-chen
            }
        }
    }

final void activityStoppedLocked(ActivityRecord r, Bundle icicle,
            PersistableBundle persistentState, CharSequence description) { //通过该方法设置Activity状态为 STOPPED
        ...... 
        if (icicle != null) {
            // If icicle is null, this is happening due to a timeout, so we
            // haven't really saved the state.
            r.icicle = icicle;
            r.haveState = true;
            r.launchCount = 0;
            r.updateThumbnailLocked(null, description);
        }
        if (!r.stopped) {
            if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r + " (stop complete)");
            mHandler.removeMessages(STOP_TIMEOUT_MSG, r);
            r.stopped = true;
            r.state = ActivityState.STOPPED; //设置前一个Activity 的状态为STOPPED
            Log.d(TAG+"STOPPED",Log.getStackTraceString(new Throwable()));//Keiven-chen
            if (mActivityContainer.mActivityDisplay.mVisibleBehindActivity == r) {
                mStackSupervisor.requestVisibleBehindLocked(r, false);
            }
            if (r.finishing) {
                r.clearOptionsLocked();
            } else {
                if (r.configDestroy) {
                    destroyActivityLocked(r, true, "stop-config");
                    mStackSupervisor.resumeTopActivitiesLocked();
                } else {
                    mStackSupervisor.updatePreviousProcessLocked(r);
                }
            }
        }
    }
5. FINISHING, DESTROYING, DESTROYED

Activity 会占用很多系统资源,当Activity 不需要显示的时候需要回收相关资源,这个过程涉及到的三个状态就是 FINISHING, DESTROYING, DESTROYED;
FINISHING 状态在 finishCurrentActivityLocked方法中设置;

final ActivityRecord finishCurrentActivityLocked(ActivityRecord r, int mode, boolean oomAdj) {
            ......
            r.state = ActivityState.STOPPING;//设置Activity 的状态为STOPPING
            Log.d(TAG + "STOPPING",Log.getStackTraceString(new Throwable()));//Keiven-chen
            if (oomAdj) {
                mService.updateOomAdjLocked();
            }
            return r;
        }

        // make sure the record is cleaned out of other places.
        mStackSupervisor.mStoppingActivities.remove(r);
        mStackSupervisor.mGoingToSleepActivities.remove(r);
        mStackSupervisor.mWaitingVisibleActivities.remove(r);
        if (mResumedActivity == r) {
            mResumedActivity = null;
        }
        final ActivityState prevState = r.state;
        r.state = ActivityState.FINISHING; //设置Activity 状态为FINISHING
        Log.d(TAG + "FINISHING",Log.getStackTraceString(new Throwable()));//Keiven-chen

        if (mode == FINISH_IMMEDIATELY
                || prevState == ActivityState.STOPPED
                || prevState == ActivityState.INITIALIZING) {
            // If this activity is already stopped, we can just finish
            // it right now.
            r.makeFinishing();
            boolean activityRemoved = destroyActivityLocked(r, true, "finish-imm");//该方法会销毁Activity,即Activity通过该方法进入 DESTROYING状态;
            if (activityRemoved) {
                mStackSupervisor.resumeTopActivitiesLocked();
            }
            return activityRemoved ? null : r;
        }
        mStackSupervisor.mFinishingActivities.add(r);
        r.resumeKeyDispatchingLocked();
        mStackSupervisor.getFocusedStack().resumeTopActivityLocked(null);
        return r;
    }

Recents中清除应用会调用ProcessRecord的Kil掉进程,Kill进程就会导致进程的Binder死亡,会触发binderDied被调用,该方法会回收每一个Activity 资源,这样Activity就处于DESTROYED状态了,即Activity 处于完全销毁状态;

/**
     * Perform the common clean-up of an activity record.  This is called both
     * as part of destroyActivityLocked() (when destroying the client-side
     * representation) and cleaning things up as a result of its hosting
     * processing going away, in which case there is no remaining client-side
     * state to destroy so only the cleanup here is needed.
     */
    final void cleanUpActivityLocked(ActivityRecord r, boolean cleanServices,
            boolean setState) {
        if (mResumedActivity == r) {
            mResumedActivity = null;
        }
        if (mPausingActivity == r) {
            mPausingActivity = null;
        }
        mService.clearFocusedActivity(r);

        r.configDestroy = false;
        r.frozenBeforeDestroy = false;

        if (setState) {
            r.state = ActivityState.DESTROYED; //设置Activity的状态为DESTROYED
            Log.d(TAG + "DESTROYED",Log.getStackTraceString(new Throwable()));//Keiven-chen
            r.app = null;
        }

        // Make sure this record is no longer in the pending finishes list.
        // This could happen, for example, if we are trimming activities
        // down to the max limit while they are still waiting to finish.
        mStackSupervisor.mFinishingActivities.remove(r);
        mStackSupervisor.mWaitingVisibleActivities.remove(r);

        // Remove any pending results.
        if (r.finishing && r.pendingResults != null) {
            for (WeakReference<PendingIntentRecord> apr : r.pendingResults) {
                PendingIntentRecord rec = apr.get();
                if (rec != null) {
                    mService.cancelIntentSenderLocked(rec, false);
                }
            }
            r.pendingResults = null;
        }

        if (cleanServices) {
            cleanUpActivityServicesLocked(r);
        }

        // Get rid of any pending idle timeouts.
        removeTimeoutsForActivityLocked(r);
        if (getVisibleBehindActivity() == r) {
            mStackSupervisor.requestVisibleBehindLocked(r, false);
        }
    }
Log演示:下面是Activity-A 通过startActivity方法打开Activity-B过程中两个Activity 状态变化过程LOG
11-13 15:54:18.964 2899-3804/system_process I/ActivityManager: START u0 {cmp=test.activitytest/.SecondActivity} from uid 10061 on display 0
11-13 15:54:18.964 2899-3804/system_process D/ActivityManagerINITIALIZING: java.lang.Throwable  //Activity-B 处于INITIALIZING状态
                          at com.android.server.am.ActivityRecord.<init>(ActivityRecord.java:405)
                          at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1527)
                          at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:995)
                          at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:3497)
                          at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:3484)
                          at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:140)
                          at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2253)
                          at android.os.Binder.execTransact(Binder.java:446)
11-13 15:54:18.973 2899-3804/system_process D/ActivityManagerPAUSING: java.lang.Throwable  //Activity-A 处于 PAUSING状态
                      at com.android.server.am.ActivityStack.startPausingLocked(ActivityStack.java:827)
                      at com.android.server.am.ActivityStack.resumeTopActivityInnerLocked(ActivityStack.java:1642)
                      at com.android.server.am.ActivityStack.resumeTopActivityLocked(ActivityStack.java:1480)
                      at com.android.server.am.ActivityStackSupervisor.resumeTopActivitiesLocked(ActivityStackSupervisor.java:2518)
                      at com.android.server.am.ActivityStack.startActivityLocked(ActivityStack.java:2127)
                      at com.android.server.am.ActivityStackSupervisor.startActivityUncheckedLocked(ActivityStackSupervisor.java:2258)
                      at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1560)
                      at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:995)
                      at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:3497)
                      at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:3484)
                      at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:140)
                      at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2253)
                      at android.os.Binder.execTransact(Binder.java:446)
11-13 15:54:18.992 2899-4338/system_process D/ActivityManagerPAUSED: java.lang.Throwable //Activity-A 处于 PAUSED状态
                      at com.android.server.am.ActivityStack.completePauseLocked(ActivityStack.java:974)
                      at com.android.server.am.ActivityStack.activityPausedLocked(ActivityStack.java:916)
                      at com.android.server.am.ActivityManagerService.activityPaused(ActivityManagerService.java:6459)
                      at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:513)
                      at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2253)
                      at android.os.Binder.execTransact(Binder.java:446)
11-13 15:54:19.003 2899-4338/system_process D/ActivityManagerRESUMED: java.lang.Throwable // Activity-B 处于RESUMED状态
                      at com.android.server.am.ActivityStack.minimalResumeActivityLocked(ActivityStack.java:659)
                      at com.android.server.am.ActivityStackSupervisor.realStartActivityLocked(ActivityStackSupervisor.java:1279)
                      at com.android.server.am.ActivityStackSupervisor.startSpecificActivityLocked(ActivityStackSupervisor.java:1326)
                      at com.android.server.am.ActivityStack.resumeTopActivityInnerLocked(ActivityStack.java:1928)
                      at com.android.server.am.ActivityStack.resumeTopActivityLocked(ActivityStack.java:1480)
                      at com.android.server.am.ActivityStackSupervisor.resumeTopActivitiesLocked(ActivityStackSupervisor.java:2518)
                      at com.android.server.am.ActivityStack.completePauseLocked(ActivityStack.java:1020)
                      at com.android.server.am.ActivityStack.activityPausedLocked(ActivityStack.java:916)
                      at com.android.server.am.ActivityManagerService.activityPaused(ActivityManagerService.java:6459)
                      at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:513)
                      at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2253)
                      at android.os.Binder.execTransact(Binder.java:446)
11-13 15:54:19.157 2899-2942/system_process I/ActivityManager: Displayed test.activitytest/.SecondActivity: +165ms
11-13 15:54:19.186 2899-2937/system_process D/ActivityManagerSTOPPING: java.lang.Throwable //Activity-A 处于STOPPING状态
                     at com.android.server.am.ActivityStack.stopActivityLocked(ActivityStack.java:2548)
                     at com.android.server.am.ActivityStackSupervisor.activityIdleInternalLocked(ActivityStackSupervisor.java:2391)
                     at com.android.server.am.ActivityStackSupervisor$ActivityStackSupervisorHandler.activityIdleInternal(ActivityStackSupervisor.java:3586)
                     at com.android.server.am.ActivityStackSupervisor$ActivityStackSupervisorHandler.handleMessage(ActivityStackSupervisor.java:3608)
                     at android.os.Handler.dispatchMessage(Handler.java:102)
                     at android.os.Looper.loop(Looper.java:135)
                     at android.os.HandlerThread.run(HandlerThread.java:61)
                     at com.android.server.ServiceThread.run(ServiceThread.java:46)
11-13 15:54:19.209 2899-4338/system_process D/ActivityManagerSTOPPED: java.lang.Throwable //Activity-A 处于STOPPED状态
                     at com.android.server.am.ActivityStack.activityStoppedLocked(ActivityStack.java:951)
                     at com.android.server.am.ActivityManagerService.activityStopped(ActivityManagerService.java:6480)
                     at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:524)
                     at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2253)
                     at android.os.Binder.execTransact(Binder.java:446)

上面是从Activity-A跳转到Activity-B的状态变化调用栈,此时在Activity-B的界面点击Recents,然后清除当前任务栈,此时Activity-A跳转到Activity-B的状态变化调用栈如下:

11-13 16:13:44.658 2899-4434/system_process D/ActivityManagerFINISHING: java.lang.Throwable
                       at com.android.server.am.ActivityStack.finishCurrentActivityLocked(ActivityStack.java:2825)
                       at com.android.server.am.ActivityStack.finishActivityLocked(ActivityStack.java:2775)
                       at com.android.server.am.TaskRecord.performClearTaskAtIndexLocked(TaskRecord.java:613)
                       at com.android.server.am.TaskRecord.removeTaskActivitiesLocked(TaskRecord.java:702)
                        com.android.server.am.ActivityManagerService.removeTaskByIdLocked(ActivityManagerService.java:8627)
                       at com.android.server.am.ActivityManagerService.removeTask(ActivityManagerService.java:8645)
                       at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:1908)
                       at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2253)
                       at android.os.Binder.execTransact(Binder.java:446)
11-13 16:13:44.659 2899-4434/system_process D/ActivityManagerDESTROYING: java.lang.Throwable
                        at com.android.server.am.ActivityStack.destroyActivityLocked(ActivityStack.java:3265)
                        at com.android.server.am.ActivityStack.finishCurrentActivityLocked(ActivityStack.java:2833)
                        at com.android.server.am.ActivityStack.finishActivityLocked(ActivityStack.java:2775)
                        at com.android.server.am.TaskRecord.performClearTaskAtIndexLocked(TaskRecord.java:613)
                        at com.android.server.am.TaskRecord.removeTaskActivitiesLocked(TaskRecord.java:702)
                        at com.android.server.am.ActivityManagerService.removeTaskByIdLocked(ActivityManagerService.java:8627)
                        at com.android.server.am.ActivityManagerService.removeTask(ActivityManagerService.java:8645)
                        at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:1908)
                        at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2253)
                        at android.os.Binder.execTransact(Binder.java:446)
11-13 16:13:44.661 2899-4434/system_process D/ActivityManagerFINISHING: java.lang.Throwable
                        at com.android.server.am.ActivityStack.finishCurrentActivityLocked(ActivityStack.java:2825)
                        at com.android.server.am.ActivityStack.finishActivityLocked(ActivityStack.java:2775)
                        at com.android.server.am.TaskRecord.performClearTaskAtIndexLocked(TaskRecord.java:613)
                        at com.android.server.am.TaskRecord.removeTaskActivitiesLocked(TaskRecord.java:702)
                        at com.android.server.am.ActivityManagerService.removeTaskByIdLocked(ActivityManagerService.java:8627)
                        at com.android.server.am.ActivityManagerService.removeTask(ActivityManagerService.java:8645)
                        at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:1908)
                        at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2253)
                        at android.os.Binder.execTransact(Binder.java:446)
11-13 16:13:44.879 2899-4434/system_process D/ActivityManagerDESTROYING: java.lang.Throwable
                        at com.android.server.am.ActivityStack.destroyActivityLocked(ActivityStack.java:3265)
                        at com.android.server.am.ActivityStack.finishCurrentActivityLocked(ActivityStack.java:2833)
                        at com.android.server.am.ActivityStack.finishActivityLocked(ActivityStack.java:2775)
                        at com.android.server.am.TaskRecord.performClearTaskAtIndexLocked(TaskRecord.java:613)
                        at com.android.server.am.TaskRecord.removeTaskActivitiesLocked(TaskRecord.java:702)
                        at com.android.server.am.ActivityManagerService.removeTaskByIdLocked(ActivityManagerService.java:8627)
                        at com.android.server.am.ActivityManagerService.removeTask(ActivityManagerService.java:8645)
                        at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:1908)
                        at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2253)
                        at android.os.Binder.execTransact(Binder.java:446)
11-13 16:13:44.879 2899-4434/system_process D/ActivityManagerKill: java.lang.Throwable//Kill 进程,释放资源
                        at com.android.server.am.ProcessRecord.kill(ProcessRecord.java:530)
                        at com.android.server.am.ActivityManagerService.cleanUpRemovedTaskLocked(ActivityManagerService.java:8569)
                        at com.android.server.am.ActivityManagerService.removeTaskByIdLocked(ActivityManagerService.java:8628)
                        at com.android.server.am.ActivityManagerService.removeTask(ActivityManagerService.java:8645)
                        at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:1908)
                        at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2253)
                        at android.os.Binder.execTransact(Binder.java:446)
11-13 16:13:44.997 2899-4436/system_process D/ActivityManagerDESTROYED: java.lang.Throwable
                        at com.android.server.am.ActivityStack.removeActivityFromHistoryLocked(ActivityStack.java:3066)
                        at com.android.server.am.ActivityStack.removeHistoryRecordsForAppLocked(ActivityStack.java:3446)
                        at com.android.server.am.ActivityStack.handleAppDiedLocked(ActivityStack.java:3994)
                        at com.android.server.am.ActivityStackSupervisor.handleAppDiedLocked(ActivityStackSupervisor.java:2435)
                        at com.android.server.am.ActivityManagerService.handleAppDiedLocked(ActivityManagerService.java:4698)
                        at com.android.server.am.ActivityManagerService.appDiedLocked(ActivityManagerService.java:4850)
                        at com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied(ActivityManagerService.java:1228)
                        at android.os.BinderProxy.sendDeathNotice(Binder.java:551)
11-13 16:14:00.198 2899-4436/system_process D/ActivityManagerDESTROYED: java.lang.Throwable
                        at com.android.server.am.ActivityStack.cleanUpActivityLocked(ActivityStack.java:3012)
                        at com.android.server.am.ActivityStack.removeHistoryRecordsForAppLocked(ActivityStack.java:3467)
                        at com.android.server.am.ActivityStack.handleAppDiedLocked(ActivityStack.java:3994)
                        at com.android.server.am.ActivityStackSupervisor.handleAppDiedLocked(ActivityStackSupervisor.java:2435)
                        at com.android.server.am.ActivityManagerService.handleAppDiedLocked(ActivityManagerService.java:4698)
                        at com.android.server.am.ActivityManagerService.appDiedLocked(ActivityManagerService.java:4850)
                        at com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied(ActivityManagerService.java:1228)
                        at android.os.BinderProxy.sendDeathNotice(Binder.java:551)
11-13 16:14:00.356 2899-4436/system_process D/ActivityManagerDESTROYED: java.lang.Throwable
                        at com.android.server.am.ActivityStack.removeActivityFromHistoryLocked(ActivityStack.java:3066)
                        at com.android.server.am.ActivityStack.removeHistoryRecordsForAppLocked(ActivityStack.java:3446)
                        at com.android.server.am.ActivityStack.handleAppDiedLocked(ActivityStack.java:3994)
                        at com.android.server.am.ActivityStackSupervisor.handleAppDiedLocked(ActivityStackSupervisor.java:2435)
                        at com.android.server.am.ActivityManagerService.handleAppDiedLocked(ActivityManagerService.java:4698)
                        at com.android.server.am.ActivityManagerService.appDiedLocked(ActivityManagerService.java:4850)
                        at com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied(ActivityManagerService.java:1228)
                        at android.os.BinderProxy.sendDeathNotice(Binder.java:551)
11-13 16:14:00.560 2899-4436/system_process D/ActivityManagerDESTROYED: java.lang.Throwable
                       at com.android.server.am.ActivityStack.cleanUpActivityLocked(ActivityStack.java:3012)
                       at com.android.server.am.ActivityStack.removeHistoryRecordsForAppLocked(ActivityStack.java:3467)
                       at com.android.server.am.ActivityStack.handleAppDiedLocked(ActivityStack.java:3994)
                       at com.android.server.am.ActivityStackSupervisor.handleAppDiedLocked(ActivityStackSupervisor.java:2435)
                       at com.android.server.am.ActivityManagerService.handleAppDiedLocked(ActivityManagerService.java:4698)
                       at com.android.server.am.ActivityManagerService.appDiedLocked(ActivityManagerService.java:4850)
                       at com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied(ActivityManagerService.java:1228)
                       at android.os.BinderProxy.sendDeathNotice(Binder.java:551)

由于我编写的APP 包含两个Activity(Activity-A,Activity-B),所以在Recents中清除该APP时会将两个两个Activity资源回收,所以FINISHING,DESTROYING,DESTROYED 状态都是成双出现;

总结:至此Activity 的各种状态都已经说完,完整的状态切换过程如下(Activity-A —> Activity-B)
RESUMED(A)->INITIALIZING(B)->PAUSING(A)->PAUSED(A)->RESUMED(B)->STOPING(A)->STOPED(A)->FINISHING(A) (正常从A->B 启动情况,这种情况不涉及到Destroy Activity)
RESUMED(A)->INITIALIZING(B)->PAUSING(A)->PAUSED(A)->RESUMED(B)->STOPING(A)->STOPED(A)->FINISHING(A)->DESTROYING(A)->DESTROYED(A)(涉及销毁情况,这里只销毁A,B的销毁过程类似),当Activity 处于RESUMED状态时,我们就可以和该Activity进行交互了;

    原文作者:开开向前冲
    原文地址: https://www.jianshu.com/p/29fd064f680d
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞