美文网首页
Android Activity的启动过程-7 - Activi

Android Activity的启动过程-7 - Activi

作者: 行走中的3卡 | 来源:发表于2023-09-19 15:31 被阅读0次

    在 Android ROS (11) 及之前,是 ActivityStackSupervisor.
    在 Android SOS (12) 及之后,是 ActivityTaskSupervisor.
    即由 XXXStackXXX -> XXXTaskXXX.
    再往后可能会删除这个类,把它的逻辑移至相关类中.

    另外, Android SOS 上也删除了 ActivityStack 类(继承自 Task).
    猜测是统一用 Task 了, 太多类更容易 混淆.

    1. 源码

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

    // TODO: This class has become a dumping ground. Let's
    // - Move things relating to the hierarchy to RootWindowContainer
    // - Move things relating to activity life cycles to maybe a new class called ActivityLifeCycler
    // - Move interface things to ActivityTaskManagerService.
    // - All other little things to other files.
    public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
        private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityTaskSupervisor" : TAG_ATM;
        
        final ActivityTaskManagerService mService;
        RootWindowContainer mRootWindowContainer;
    
    
        /** List of requests waiting for the target activity to be launched or visible. */
        private final ArrayList<WaitInfo> mWaitingActivityLaunched = new ArrayList<>();
    
        /** List of activities that are ready to be stopped, but waiting for the next activity to
         * settle down before doing so. */
        final ArrayList<ActivityRecord> mStoppingActivities = new ArrayList<>();
    
        /**
         * Cached value of the topmost resumed activity in the system. Updated when new activity is
         * resumed.
         */
        private ActivityRecord mTopResumedActivity; 
    

    从上面的变量可以看出, 它有与 ATMS /RWC 交互,并且后续的逻辑会移动到对应的类。
    并且 有系列 关于 Activity 生命周期的操作

    再看下它的构造函数:

        public ActivityTaskSupervisor(ActivityTaskManagerService service, Looper looper) {
            mService = service;
            mLooper = looper;
            mHandler = new ActivityTaskSupervisorHandler(looper);
        }
        
        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);
        }               
    

    一些关键方法:

        boolean realStartActivityLocked(ActivityRecord r, WindowProcessController proc,
                boolean andResume, boolean checkConfig) throws RemoteException {
                final Task task = r.getTask();
            final Task rootTask = task.getRootTask();       
        }
    

    2. 已删除的 ActivityStack

    在 Android S (12) 上,已经删除了 ActivityStack。
    Android 11 上才有。

    2.1 Android ROS (11) 上的 ActivityStack

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

    /**
     * State and management of a single stack of activities.
     */
    class ActivityStack extends Task {
        private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityStack" : TAG_ATM;
        
        enum ActivityState {
            INITIALIZING,
            STARTED,
            RESUMED,
            PAUSING,
            PAUSED,
            STOPPING,
            STOPPED,
            FINISHING,
            DESTROYING,
            DESTROYED,
            RESTARTING_PROCESS
        }
           /**
         * Used to keep resumeTopActivityUncheckedLocked() from being entered recursively
         */
        boolean mInResumeTopActivity = false;
    
        int mCurrentUser;
    
        /** For comparison with DisplayContent bounds. */
        private Rect mTmpRect = new Rect();
        private Rect mTmpRect2 = new Rect();
    
    

    一些关键方法:

        void moveToFront(String reason) {
            moveToFront(reason, null);
        }
    
        /**
         * @param reason The reason for moving the stack to the front.
         * @param task If non-null, the task will be moved to the top of the stack.
         * */
        void moveToFront(String reason, Task task) {
            if (!isAttached()) {
                return;
            }
    
            final TaskDisplayArea taskDisplayArea = getDisplayArea();
        }
        
        /**
         * This moves 'task' to the back of this task and also recursively moves this task to the back
         * of its parents (if applicable).
         *
         * @param reason The reason for moving the stack to the back.
         * @param task If non-null, the task will be moved to the bottom of the stack.
         **/
        void moveToBack(String reason, Task task) {
            if (!isAttached()) {
                return;
            }
            final TaskDisplayArea displayArea = getDisplayArea();
        }
        
        @GuardedBy("mService")
        boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {
            if (mInResumeTopActivity) {
                // Don't even start recursing.
                return false;
            }
    
            boolean result = false;
            try {
         }
    
        void startActivityLocked(ActivityRecord r, ActivityRecord focusedTopActivity,
                boolean newTask, boolean keepCurTransition, ActivityOptions options) {
            Task rTask = r.getTask();
            final boolean allowMoveToFront = options == null || !options.getAvoidMoveToFront();
            final boolean isOrhasTask = rTask == this || hasChild(rTask);
            // mLaunchTaskBehind tasks get placed at the back of the task stack.
            if (!r.mLaunchTaskBehind && allowMoveToFront && (!isOrhasTask || newTask)) {
                // Last activity in task had been removed or ActivityManagerService is reusing task.
                // Insert or replace.
                // Might not even be in.
                positionChildAtTop(rTask);
            }
            Task task = null;
        }       
    

    大概可以看出,这些方法现在都在 Task 类里。

    相关文章

      网友评论

          本文标题:Android Activity的启动过程-7 - Activi

          本文链接:https://www.haomeiwen.com/subject/ttjppdtx.html