ActivityManagerService启动activity流程简析(二)

Task.java

    private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {

      ...

        // 1.获取栈顶的activity

        ActivityRecord next = topRunningActivity(true /* focusableOnly */);

      ...

        //确保启动该activity的用户存在

        if (!mAtmService.mAmInternal.hasStartedUserState(next.mUserId)) {

            Slog.w(TAG, "Skipping resume of top activity " + next

                    + ": user " + next.mUserId + " is stopped");

            return false;

        }

      ...

        //暂停当前运行的activity

        boolean pausing = taskDisplayArea.pauseBackStacks(userLeaving, next);

        if (mResumedActivity != null) {

            if (DEBUG_STATES) Slog.d(TAG_STATES,

                    "resumeTopActivityLocked: Pausing " + mResumedActivity);

           //暂停栈顶已激活的activity

            pausing |= startPausingLocked(userLeaving, false /* uiSleeping */, next);

        }

        if (pausing) {

            if (DEBUG_SWITCH || DEBUG_STATES) Slog.v(TAG_STATES,

                    "resumeTopActivityLocked: Skip resume: need to start pausing");

               ...

            if (next.attachedToProcess()) {

               ...

                //启动目标Activity

                mAtmService.getAppWarningsLocked().onResumeActivity(next);

                next.app.setPendingUiCleanAndForceProcessStateUpTo(mAtmService.mTopProcessState);

                next.abortAndClearOptionsAnimation();

                transaction.setLifecycleStateRequest(

                        ResumeActivityItem.obtain(next.app.getReportedProcState(),

                                dc.isNextTransitionForward()));

                mAtmService.getLifecycleManager().scheduleTransaction(transaction)

               ...

        } else {

            // 进程无关联,需要启动目标activity所在进程

            if (!next.hasBeenLaunched) {

                next.hasBeenLaunched = true;

            } else {

                if (SHOW_APP_STARTING_PREVIEW) {

                    next.showStartingWindow(null /* prev */, false /* newTask */,

                            false /* taskSwich */);

                }

                if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "Restarting: " + next);

            }

            if (DEBUG_STATES) Slog.d(TAG_STATES, "resumeTopActivityLocked: Restarting " + next);

            mStackSupervisor.startSpecificActivity(next, true, true);

        }

        return true;

    }

获取栈顶已激活的activity进行暂停。

final boolean startPausingLocked(boolean userLeaving, boolean uiSleeping,

            ActivityRecord resuming) {

       ...

        //获取栈顶已激活的activity

        ActivityRecord prev = mResumedActivity;

        ...

        if (prev.attachedToProcess()) {

            if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Enqueueing pending pause: " + prev);

            try {

                EventLogTags.writeWmPauseActivity(prev.mUserId, System.identityHashCode(prev),

                        prev.shortComponentName, "userLeaving=" + userLeaving);

               ...

              //通过Binder机制向应用进程发送消息

                mAtmService.getLifecycleManager().scheduleTransaction(prev.app.getThread(),

                        prev.appToken, PauseActivityItem.obtain(prev.finishing, userLeaving,

                                prev.configChangeFlags, pauseImmediately));

            } catch (Exception e) {

                Slog.w(TAG, "Exception thrown during pause", e);

                mPausingActivity = null;

                mLastPausedActivity = null;

                mLastNoHistoryActivity = null;

            }

        } else {

            mPausingActivity = null;

            mLastPausedActivity = null;

            mLastNoHistoryActivity = null;

        }

       ...

    }

如果栈顶已激活activity的进程存在,开始执行状态转换。

ClientLifecycleManager.java。

    void scheduleTransaction(@NonNull IApplicationThread client, @NonNull IBinder activityToken,

            @NonNull ActivityLifecycleItem stateRequest) throws RemoteException {

       //获取ActivityThread代理

        final ClientTransaction clientTransaction = transactionWithState(client, activityToken,

                stateRequest);

        scheduleTransaction(clientTransaction);

    }

获取activityThread代理。

    void scheduleTransaction(ClientTransaction transaction) throws RemoteException {

        final IApplicationThread client = transaction.getClient();

        transaction.schedule();

        if (!(client instanceof Binder)) {

            // 如果client不是Binder实例,则进行回收,在ActivityThread中执行

            transaction.recycle();

        }

    }

ClientTransaction.java.

    public void schedule() throws RemoteException {

       mClient.scheduleTransaction(this);

    }

按以下顺序安排事务:

1.主线程调用preExecute,触发所有需要在真正调度事务前执行完毕的工作。
2.发送事务的message到主线程。
3.主线程调用TransactionExecutor.execute,执行所有回调以及必要的生命周期事务。

mClient是ActivityThread的Binder对象,ActivityThread继承ClientTransactionHandler。

ClientTransactionHandler.java

    void scheduleTransaction(ClientTransaction transaction) {

        transaction.preExecute(this);

        sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);

   }

ActivityThread接收到消息后,会调用TransactionExecutor.execute执行生命周期转换。

TransactionExecutor.java

    public void execute(ClientTransaction transaction) {

     ...

        executeCallbacks(transaction);

        executeLifecycleState(transaction);

        mPendingActions.clear();

    }

检查目标状态并执行。

    private void executeLifecycleState(ClientTransaction transaction) {

        final ActivityLifecycleItem lifecycleItem = transaction.getLifecycleStateRequest();

        if (lifecycleItem == null) {

            return;

        }

        final IBinder token = transaction.getActivityToken();

        final ActivityClientRecord r = mTransactionHandler.getActivityClient(token);

        if (DEBUG_RESOLVER) {

            Slog.d(TAG, tId(transaction) + "Resolving lifecycle state: "

                    + lifecycleItem + " for activity: "

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值