美文网首页
Android-四大组件-Activity(三)源码分析由一个A

Android-四大组件-Activity(三)源码分析由一个A

作者: 地平线上的螃蟹 | 来源:发表于2019-12-04 17:28 被阅读0次

    我们上一章分析了由Launcher启动应用MainActivity时的源码,涉及到MainActivity的三个生命周期onCreate(),onStart(),onResume(),现在我们继续走完剩下的生命周期,我们新建一个AActivity,在MainActivity中做跳转。

    startActivity(new Intent(this,AActivity.class));
    

    追踪startActivity()方法的源码。

        public void startActivity(Intent intent) {
            this.startActivity(intent, null);
        }
    
        public void startActivity(Intent intent, @Nullable Bundle options) {
            if (options != null) {
                startActivityForResult(intent, -1, options);
            } else {
                // Note we want to go through this call for compatibility with
                // applications that may have overridden the method.
                startActivityForResult(intent, -1);
            }
        }
    

    此时我们没设置Bundle 参数,所以options 为null。

     public void startActivityForResult(@RequiresPermission Intent intent, int requestCode) {
            startActivityForResult(intent, requestCode, null);
        }
    
     public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
                @Nullable Bundle options) {
            if (mParent == null) {
                options = transferSpringboardActivityOptions(options);
                Instrumentation.ActivityResult ar =
                    mInstrumentation.execStartActivity(
                        this, mMainThread.getApplicationThread(), mToken, this,
                        intent, requestCode, options);
                if (ar != null) {
                    mMainThread.sendActivityResult(
                        mToken, mEmbeddedID, requestCode, ar.getResultCode(),
                        ar.getResultData());
                }
                if (requestCode >= 0) {
                    mStartedActivity = true;
                }
    
                cancelInputsAndStartExitTransition(options);
                // TODO Consider clearing/flushing other event sources and events for child windows.
            } else {
                if (options != null) {
                    mParent.startActivityFromChild(this, intent, requestCode, options);
                } else {
                    // Note we want to go through this method for compatibility with
                    // existing applications that may have overridden it.
                    mParent.startActivityFromChild(this, intent, requestCode);
                }
            }
        }
    

    此时mParent为null,所以调用了mInstrumentation.execStartActivity()方法。

     private Instrumentation mInstrumentation;
    

    所有我们在Instrumentation类中找到execStartActivity()方法。

    public ActivityResult execStartActivity(
                Context who, IBinder contextThread, IBinder token, Activity target,
                Intent intent, int requestCode, Bundle options) {
            IApplicationThread whoThread = (IApplicationThread) contextThread;
            Uri referrer = target != null ? target.onProvideReferrer() : null;
            if (referrer != null) {
                intent.putExtra(Intent.EXTRA_REFERRER, referrer);
            }
            if (mActivityMonitors != null) {
                synchronized (mSync) {
                    final int N = mActivityMonitors.size();
                    for (int i=0; i<N; i++) {
                        final ActivityMonitor am = mActivityMonitors.get(i);
                        ActivityResult result = null;
                        if (am.ignoreMatchingSpecificIntents()) {
                            result = am.onStartActivity(intent);
                        }
                        if (result != null) {
                            am.mHits++;
                            return result;
                        } else if (am.match(who, null, intent)) {
                            am.mHits++;
                            if (am.isBlocking()) {
                                return requestCode >= 0 ? am.getResult() : null;
                            }
                            break;
                        }
                    }
                }
            }
            try {
                intent.migrateExtraStreamToClipData();
                intent.prepareToLeaveProcess(who);
                int result = ActivityManager.getService()
                    .startActivity(whoThread, who.getBasePackageName(), intent,
                            intent.resolveTypeIfNeeded(who.getContentResolver()),
                            token, target != null ? target.mEmbeddedID : null,
                            requestCode, 0, null, options);
                checkStartActivityResult(result, intent);
            } catch (RemoteException e) {
                throw new RuntimeException("Failure from system", e);
            }
            return null;
        }
    

    这里我们只看ActivityManager.getService().startActivity()方法。这里就是调用ActivityManagerService的startActivity()方法,这就由回到了我们上一章的流程,新启动的Activity也就是AActivity调用onCreate(),onStart(),onResume(),那么是什么时候我们调用了MainActivity的onPause()和onStop()方法的呢,我们来看ActivityStack类的resumeTopActivityInnerLocked()方法,此时AActivity
    还没有走到onCreate()方法。

    private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {
            if (!mService.mBooting && !mService.mBooted) {
                // Not ready yet!
                return false;
            }
    
            // Find the next top-most activity to resume in this stack that is not finishing and is
            // focusable. If it is not focusable, we will fall into the case below to resume the
            // top activity in the next focusable task.
            final ActivityRecord next = topRunningActivityLocked(true /* focusableOnly */);
            ...
            boolean pausing = mStackSupervisor.pauseBackStacks(userLeaving, next, false);
            if (mResumedActivity != null) {
                if (DEBUG_STATES) Slog.d(TAG_STATES,
                        "resumeTopActivityLocked: Pausing " + mResumedActivity);
                pausing |= startPausingLocked(userLeaving, false, next, false);
            }
            ...
            //next表示我们当前的Activity
            if (next.app != null && next.app.thread != null) {
               ...
            } else {
                ...
                mStackSupervisor.startSpecificActivityLocked(next, true, true);
            }
    
            if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked();
            return true;
        }
    

    这次我们不看mStackSupervisor.startSpecificActivityLocked(next, true, true)方法,我们来观察startPausingLocked(userLeaving, false, next, false)方法。mResumedActivity 参数是ActivityRecord的对象,此时ActivityRecord是存在的,在resumeTopActivityInnerLocked方法中加入过,我们不去追究这里,继续看startPausingLocked(userLeaving, false, next, false)方法。

    final boolean startPausingLocked(boolean userLeaving, boolean uiSleeping,
                ActivityRecord resuming, boolean pauseImmediately) {
            ...
            ActivityRecord prev = mResumedActivity;
            ...
            if (prev.app != null && prev.app.thread != null) {
                if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Enqueueing pending pause: " + prev);
                try {
                    EventLogTags.writeAmPauseActivity(prev.userId, System.identityHashCode(prev),
                            prev.shortComponentName, "userLeaving=" + userLeaving);
                    mService.updateUsageStats(prev, false);
    
                    mService.getLifecycleManager().scheduleTransaction(prev.app.thread, prev.appToken,
                            PauseActivityItem.obtain(prev.finishing, userLeaving,
                                    prev.configChangeFlags, pauseImmediately));
                } catch (Exception e) {
                 ...
                }
            } else {
              ...
            }
            ...
        }
    

    这里我们已知mResumedActivity不为null,调用了 mService.getLifecycleManager().scheduleTransaction方法,也就是ClientLifecycleManager的scheduleTransaction()方法。

    void scheduleTransaction(@NonNull IApplicationThread client, @NonNull IBinder activityToken,
                @NonNull ActivityLifecycleItem stateRequest) throws RemoteException {
            final ClientTransaction clientTransaction = transactionWithState(client, activityToken,
                    stateRequest);
            scheduleTransaction(clientTransaction);
        }
    
        void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
            final IApplicationThread client = transaction.getClient();
            transaction.schedule();
            if (!(client instanceof Binder)) {
                // If client is not an instance of Binder - it's a remote call and at this point it is
                // safe to recycle the object. All objects used for local calls will be recycled after
                // the transaction is executed on client in ActivityThread.
                transaction.recycle();
            }
        }
    

    继续来看ClientTransaction的getClient()方法。

    private IApplicationThread mClient;
      public void schedule() throws RemoteException {
            mClient.scheduleTransaction(this);
        }
    

    IApplicationThread我们在上边曾经遇到过,他的服务端在ActivityThread中,以下流程我们在上篇文章中都经历过,不过多解释。

      public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
                ActivityThread.this.scheduleTransaction(transaction);
            }
    
        void scheduleTransaction(ClientTransaction transaction) {
            transaction.preExecute(this);
            sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
        }
    
    private void sendMessage(int what, Object obj, int arg1, int arg2, boolean async) {
            if (DEBUG_MESSAGES) Slog.v(
                TAG, "SCHEDULE " + what + " " + mH.codeToString(what)
                + ": " + arg1 + " / " + obj);
            Message msg = Message.obtain();
            msg.what = what;
            msg.obj = obj;
            msg.arg1 = arg1;
            msg.arg2 = arg2;
            if (async) {
                msg.setAsynchronous(true);
            }
            mH.sendMessage(msg);
        }
    
    case EXECUTE_TRANSACTION:
                        final ClientTransaction transaction = (ClientTransaction) msg.obj;
                        mTransactionExecutor.execute(transaction);
                        if (isSystem()) {
                            // Client transactions inside system process are recycled on the client side
                            // instead of ClientLifecycleManager to avoid being cleared before this
                            // message is handled.
                            transaction.recycle();
                        }
                        // TODO(lifecycler): Recycle locally scheduled transactions.
                        break;
    
     public void execute(ClientTransaction transaction) {
            final IBinder token = transaction.getActivityToken();
            log("Start resolving transaction for client: " + mTransactionHandler + ", token: " + token);
    
            executeCallbacks(transaction);
    
            executeLifecycleState(transaction);
            mPendingActions.clear();
            log("End resolving transaction");
        }
    

    我们还是分别看一下executeCallbacks()和executeLifecycleState()。

    public void executeCallbacks(ClientTransaction transaction) {
            final List<ClientTransactionItem> callbacks = transaction.getCallbacks();
            if (callbacks == null) {
                // No callbacks to execute, return early.
                return;
            }
            log("Resolving callbacks");
    
            final IBinder token = transaction.getActivityToken();
            ActivityClientRecord r = mTransactionHandler.getActivityClient(token);
    
            // In case when post-execution state of the last callback matches the final state requested
            // for the activity in this transaction, we won't do the last transition here and do it when
            // moving to final state instead (because it may contain additional parameters from server).
            final ActivityLifecycleItem finalStateRequest = transaction.getLifecycleStateRequest();
            final int finalState = finalStateRequest != null ? finalStateRequest.getTargetState()
                    : UNDEFINED;
            // Index of the last callback that requests some post-execution state.
            final int lastCallbackRequestingState = lastCallbackRequestingState(transaction);
    
            final int size = callbacks.size();
            for (int i = 0; i < size; ++i) {
                final ClientTransactionItem item = callbacks.get(i);
                log("Resolving callback: " + item);
                final int postExecutionState = item.getPostExecutionState();
                final int closestPreExecutionState = mHelper.getClosestPreExecutionState(r,
                        item.getPostExecutionState());
                if (closestPreExecutionState != UNDEFINED) {
                    cycleToPath(r, closestPreExecutionState);
                }
    
                item.execute(mTransactionHandler, token, mPendingActions);
                item.postExecute(mTransactionHandler, token, mPendingActions);
                if (r == null) {
                    // Launch activity request will create an activity record.
                    r = mTransactionHandler.getActivityClient(token);
                }
    
                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);
                }
            }
        }
    

    这次我们的callbacks为空,这个方法整体没有调用,那我们看executeLifecycleState()方法。

     private void executeLifecycleState(ClientTransaction transaction) {
            final ActivityLifecycleItem lifecycleItem = transaction.getLifecycleStateRequest();
            if (lifecycleItem == null) {
                // No lifecycle request, return early.
                return;
            }
            log("Resolving lifecycle state: " + lifecycleItem);
    
            final IBinder token = transaction.getActivityToken();
            final ActivityClientRecord r = mTransactionHandler.getActivityClient(token);
    
            if (r == null) {
                // Ignore requests for non-existent client records for now.
                return;
            }
    
            // Cycle to the state right before the final requested state.
            cycleToPath(r, lifecycleItem.getTargetState(), true /* excludeLastState */);
    
            // Execute the final transition with proper parameters.
            lifecycleItem.execute(mTransactionHandler, token, mPendingActions);
            lifecycleItem.postExecute(mTransactionHandler, token, mPendingActions);
        }
    

    依然是调用了
    1、cycleToPath(r, lifecycleItem.getTargetState(), true /* excludeLastState */)
    2、lifecycleItem.execute(mTransactionHandler, token, mPendingActions)
    3、lifecycleItem.postExecute(mTransactionHandler, token, mPendingActions)
    按顺序分析。

    private void cycleToPath(ActivityClientRecord r, int finish,
                boolean excludeLastState) {
            final int start = r.getLifecycleState();
            log("Cycle from: " + start + " to: " + finish + " excludeLastState:" + excludeLastState);
            final IntArray path = mHelper.getLifecyclePath(start, finish, excludeLastState);
            performLifecycleSequence(r, path);
        }
    

    根据startPausingLocked()方法中的传入我们已知此时的lifecycleItem是PauseActivityItem的实例,我们还是计算一下start和finish的值。
    我们已知在MainActivity创建的过程中start的值已经被设置为ON_RESUME,而finish的值

    public int getTargetState() {
            return ON_PAUSE;
        }
    

    故而为ON_PAUSE,excludeLastState为true,而

    public IntArray getLifecyclePath(int start, int finish, boolean excludeLastState) {
            if (start == UNDEFINED || finish == UNDEFINED) {
                throw new IllegalArgumentException("Can't resolve lifecycle path for undefined state");
            }
            if (start == ON_RESTART || finish == ON_RESTART) {
                throw new IllegalArgumentException(
                        "Can't start or finish in intermittent RESTART state");
            }
            if (finish == PRE_ON_CREATE && start != finish) {
                throw new IllegalArgumentException("Can only start in pre-onCreate state");
            }
    
            mLifecycleSequence.clear();
            if (finish >= start) {
                // just go there
                for (int i = start + 1; i <= finish; i++) {
                    mLifecycleSequence.add(i);
                }
            } else { // finish < start, can't just cycle down
                if (start == ON_PAUSE && finish == ON_RESUME) {
                    // Special case when we can just directly go to resumed state.
                    mLifecycleSequence.add(ON_RESUME);
                } else if (start <= ON_STOP && finish >= ON_START) {
                    // Restart and go to required state.
    
                    // Go to stopped state first.
                    for (int i = start + 1; i <= ON_STOP; i++) {
                        mLifecycleSequence.add(i);
                    }
                    // Restart
                    mLifecycleSequence.add(ON_RESTART);
                    // Go to required state
                    for (int i = ON_START; i <= finish; i++) {
                        mLifecycleSequence.add(i);
                    }
                } else {
                    // Relaunch and go to required state
    
                    // Go to destroyed state first.
                    for (int i = start + 1; i <= ON_DESTROY; i++) {
                        mLifecycleSequence.add(i);
                    }
                    // Go to required state
                    for (int i = ON_CREATE; i <= finish; i++) {
                        mLifecycleSequence.add(i);
                    }
                }
            }
    
            // Remove last transition in case we want to perform it with some specific params.
            if (excludeLastState && mLifecycleSequence.size() != 0) {
                mLifecycleSequence.remove(mLifecycleSequence.size() - 1);
            }
    
            return mLifecycleSequence;
        }
    

    故mLifecycleSequence为空集,cycleToPath()方法无实现,再来看lifecycleItem.execute()。

        public void execute(ClientTransactionHandler client, IBinder token,
                PendingTransactionActions pendingActions) {
            Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityPause");
            client.handlePauseActivity(token, mFinished, mUserLeaving, mConfigChanges, pendingActions,
                    "PAUSE_ACTIVITY_ITEM");
            Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
        }
    

    ClientTransactionHandler是ActivityThread的父类,只是定义了handlePauseActivity的抽象方法,具体实现还在ActivityThread中。

    public void handlePauseActivity(IBinder token, boolean finished, boolean userLeaving,
                int configChanges, PendingTransactionActions pendingActions, String reason) {
            ActivityClientRecord r = mActivities.get(token);
            if (r != null) {
                if (userLeaving) {
                    performUserLeavingActivity(r);
                }
    
                r.activity.mConfigChangeFlags |= configChanges;
                performPauseActivity(r, finished, reason, pendingActions);
    
                // Make sure any pending writes are now committed.
                if (r.isPreHoneycomb()) {
                    QueuedWork.waitToFinish();
                }
                mSomeActivitiesChanged = true;
            }
        }
    

    继续看performPauseActivity()方法。

    private Bundle performPauseActivity(ActivityClientRecord r, boolean finished, String reason,
                PendingTransactionActions pendingActions) {
            ...
            // Pre-Honeycomb apps always save their state before pausing
            final boolean shouldSaveState = !r.activity.mFinished && r.isPreHoneycomb();
            if (shouldSaveState) {
                callActivityOnSaveInstanceState(r);
            }
    
            performPauseActivityIfNeeded(r, reason);
            ...
    
            return shouldSaveState ? r.state : null;
        }
    
    private void performPauseActivityIfNeeded(ActivityClientRecord r, String reason) {
            if (r.paused) {
                // You are already paused silly...
                return;
            }
    
            try {
                r.activity.mCalled = false;
                mInstrumentation.callActivityOnPause(r.activity);
                if (!r.activity.mCalled) {
                    throw new SuperNotCalledException("Activity " + safeToComponentShortString(r.intent)
                            + " did not call through to super.onPause()");
                }
            } catch (SuperNotCalledException e) {
                throw e;
            } catch (Exception e) {
                if (!mInstrumentation.onException(r.activity, e)) {
                    throw new RuntimeException("Unable to pause activity "
                            + safeToComponentShortString(r.intent) + ": " + e.toString(), e);
                }
            }
            r.setState(ON_PAUSE);
        }
    

    在这里调用了 mInstrumentation.callActivityOnPause(r.activity)方法并且 r.setState(ON_PAUSE);

     public void callActivityOnPause(Activity activity) {
            activity.performPause();
        }
    
    final void performPause() {
            mDoReportFullyDrawn = false;
            mFragments.dispatchPause();
            mCalled = false;
            onPause();
            writeEventLog(LOG_AM_ON_PAUSE_CALLED, "performPause");
            mResumed = false;
            if (!mCalled && getApplicationInfo().targetSdkVersion
                    >= android.os.Build.VERSION_CODES.GINGERBREAD) {
                throw new SuperNotCalledException(
                        "Activity " + mComponent.toShortString() +
                        " did not call through to super.onPause()");
            }
        }
    
    protected void onPause() {
            if (DEBUG_LIFECYCLE) Slog.v(TAG, "onPause " + this);
            getApplication().dispatchActivityPaused(this);
            if (mAutoFillResetNeeded) {
                if (!mAutoFillIgnoreFirstResumePause) {
                    if (DEBUG_LIFECYCLE) Slog.v(TAG, "autofill notifyViewExited " + this);
                    View focus = getCurrentFocus();
                    if (focus != null && focus.canNotifyAutofillEnterExitEvent()) {
                        getAutofillManager().notifyViewExited(focus);
                    }
                } else {
                    // reset after first pause()
                    if (DEBUG_LIFECYCLE) Slog.v(TAG, "autofill got first pause " + this);
                    mAutoFillIgnoreFirstResumePause = false;
                }
            }
            mCalled = true;
        }
    

    到这里我们的onPause()方法被调用了。到这里还没有结束,我们的lifecycleItem.postExecute()方法还没有追踪。

    public void postExecute(ClientTransactionHandler client, IBinder token,
                PendingTransactionActions pendingActions) {
            if (mDontReport) {
                return;
            }
            try {
                // TODO(lifecycler): Use interface callback instead of AMS.
                ActivityManager.getService().activityPaused(token);
            } catch (RemoteException ex) {
                throw ex.rethrowFromSystemServer();
            }
        }
    

    ActivityManager.getService().activityPaused(token)是调用了ActivityManagerService的activityPaused()方法。

    public final void activityPaused(IBinder token) {
            final long origId = Binder.clearCallingIdentity();
            synchronized(this) {
                ActivityStack stack = ActivityRecord.getStackLocked(token);
                if (stack != null) {
                    stack.activityPausedLocked(token, false);
                }
            }
            Binder.restoreCallingIdentity(origId);
        }
    

    调用了ActivityStack.activityPausedLocked()方法。

    final void activityPausedLocked(IBinder token, boolean timeout) {
            if (DEBUG_PAUSE) Slog.v(TAG_PAUSE,
                "Activity paused: token=" + token + ", timeout=" + timeout);
    
            final ActivityRecord r = isInStackLocked(token);
            if (r != null) {
                mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r);
                if (mPausingActivity == r) {
                    if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to PAUSED: " + r
                            + (timeout ? " (due to timeout)" : " (pause complete)"));
                    mService.mWindowManager.deferSurfaceLayout();
                    try {
                        completePauseLocked(true /* resumeNext */, null /* resumingActivity */);
                    } finally {
                        mService.mWindowManager.continueSurfaceLayout();
                    }
                    return;
                } else {
                    EventLog.writeEvent(EventLogTags.AM_FAILED_TO_PAUSE,
                            r.userId, System.identityHashCode(r), r.shortComponentName,
                            mPausingActivity != null
                                ? mPausingActivity.shortComponentName : "(none)");
                    if (r.isState(PAUSING)) {
                        r.setState(PAUSED, "activityPausedLocked");
                        if (r.finishing) {
                            if (DEBUG_PAUSE) Slog.v(TAG,
                                    "Executing finish of failed to pause activity: " + r);
                            finishCurrentActivityLocked(r, FINISH_AFTER_VISIBLE, false,
                                    "activityPausedLocked");
                        }
                    }
                }
            }
            mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
        }
    

    这里我们已知mPausingActivity == r,所以调用了 completePauseLocked(true , null)方法。

    private void completePauseLocked(boolean resumeNext, ActivityRecord resuming) {
            ActivityRecord prev = mPausingActivity;
            ...
            if (resumeNext) {
                final ActivityStack topStack = mStackSupervisor.getFocusedStack();
                if (!topStack.shouldSleepOrShutDownActivities()) {
                    mStackSupervisor.resumeFocusedStackTopActivityLocked(topStack, prev, null);
                } else {
                    ...
                }
            }
    
           ...
        }
    

    这里最终调用了ActivityStackSupervisor类的resumeFocusedStackTopActivityLocked()方法。接下来的流程就是重复第一章中Activity启动的流程,我们就不再写一遍了。到这里我们走完了MainActivity的onPause()到AActivity的onCreate()、onStart()和onResume()。

    相关文章

      网友评论

          本文标题:Android-四大组件-Activity(三)源码分析由一个A

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