startActivity源码分析1

Android2023年11月16日 pm6:30发布10个月前更新 91es.com站长
29 0 0
目录

前言

简单记录一下startActivity()源码的启动过程,主要是过一下流程,细节太多顾不上。

下面以Launcher界面启动(startActivity())未启动过的应用为例。

这部分主要涉及,启动新的Activity前,系统会让当前Activity[叫Launcher吧]进入onPause()流程。

PS :(1) 简单记录,不一定对 (2) Android P

正文

在Launcher界面启动Media应用,启动代码如下

Intent intent = new Intent();
intent.setPackage("com.biumall.media");
intent.setComponent(new ComponentName("com.biumall.media", "com.biumall.media.MediaActivity"));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

Activity.java

startActivity()
@Override
public void startActivity(Intent intent) {
    this.startActivity(intent, null);
}
startActivity()
@Override
public void startActivity(Intent intent, @Nullable Bundle options) {
    //options == null
    if (options != null) {
        startActivityForResult(intent, -1, options);
    } else {
        //注意,两个参数
        startActivityForResult(intent, -1);
    }
}
startActivityForResult()

两个参数的

public void startActivityForResult(@RequiresPermission Intent intent, int requestCode) {
    startActivityForResult(intent, requestCode, null);
}
startActivityForResult()

三个参数的

public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
        @Nullable Bundle options) {
    // mParent == null 
    if (mParent == null) {
        options = transferSpringboardActivityOptions(options);
        // 走这里
        // 调用Instrumentation.execStartActivity()
        // 存在两个,只是第四个参数不一样,注意
        Instrumentation.ActivityResult ar =
            mInstrumentation.execStartActivity(
                this, mMainThread.getApplicationThread(), mToken, this,
                intent, requestCode, options);
        // ar等于null 
        if (ar != null) {
            mMainThread.sendActivityResult(
                mToken, mEmbeddedID, requestCode, ar.getResultCode(),
                ar.getResultData());
        }
        // 传入的为-1
        if (requestCode >= 0) {
            mStartedActivity = true;
        }
        cancelInputsAndStartExitTransition(options);
    } else {
        //略
    }
}

Instrumentation.java

execStartActivity()
public ActivityResult execStartActivity(
        Context who, IBinder contextThread, IBinder token, Activity target,
        Intent intent, int requestCode, Bundle options) {
    //略
    //mActivityMonitors为null
    if (mActivityMonitors != null) {
        //略
    }
    try {
        intent.migrateExtraStreamToClipData();
        intent.prepareToLeaveProcess(who);
        //调用的ActivityManagerService.startActivity()
        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;
}

ActivityManagerService.java

startActivity()
startActivityAsUser()
startActivityAsUser()

三个放一起了,

@Override
public final int startActivity(IApplicationThread caller, String callingPackage,
        Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
        int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {
    return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
            resultWho, requestCode, startFlags, profilerInfo, bOptions,
            UserHandle.getCallingUserId());
}

@Override
public final int startActivityAsUser(IApplicationThread caller, String callingPackage,
        Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
        int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) {
    return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
            resultWho, requestCode, startFlags, profilerInfo, bOptions, userId,
            true /*validateIncomingUser*/);
}

public final int startActivityAsUser(IApplicationThread caller, String callingPackage,
        Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
        int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId,
        boolean validateIncomingUser) {
    enforceNotIsolatedCaller("startActivity");
    userId = mActivityStartController.checkTargetUser(userId, validateIncomingUser,
            Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");
    //suerid = 0
    //调用ActivityStarter.execue(),
    //具体看obtainStarter()的返回值,
    return mActivityStartController.obtainStarter(intent, "startActivityAsUser")
            .setCaller(caller)
            .setCallingPackage(callingPackage)
            .setResolvedType(resolvedType)
            .setResultTo(resultTo)
            .setResultWho(resultWho)
            .setRequestCode(requestCode)
            .setStartFlags(startFlags)
            .setProfilerInfo(profilerInfo)
            .setActivityOptions(bOptions)
            .setMayWait(userId) 
            .execute();
}

重点,调用的是ActivityStarter.execue(),上用build模式进行初始化参数。

ActivityStarter.java
execute()
int execute() {
    //setMayWait(userId)给mayWait设置true
    try {
        if (mRequest.mayWait) {
            return startActivityMayWait(mRequest.caller, mRequest.callingUid,
                    mRequest.callingPackage, mRequest.intent, mRequest.resolvedType,
                    mRequest.voiceSession, mRequest.voiceInteractor, mRequest.resultTo,
                    mRequest.resultWho, mRequest.requestCode, mRequest.startFlags,
                    mRequest.profilerInfo, mRequest.waitResult, mRequest.globalConfig,
                    mRequest.activityOptions, mRequest.ignoreTargetSecurity, mRequest.userId,
                    mRequest.inTask, mRequest.reason,
                    mRequest.allowPendingRemoteAnimationRegistryLookup);
        } else {
            //略
        }
    } finally {
        onExecutionComplete();
    }
}
startActivityMayWait()
private int startActivityMayWait(IApplicationThread caller, int callingUid,
        String callingPackage, Intent intent, String resolvedType,
        IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
        IBinder resultTo, String resultWho, int requestCode, int startFlags,
        ProfilerInfo profilerInfo, WaitResult outResult,
        Configuration globalConfig, SafeActivityOptions options, boolean ignoreTargetSecurity,
        int userId, TaskRecord inTask, String reason,
        boolean allowPendingRemoteAnimationRegistryLookup) {
	//略
    ResolveInfo rInfo = mSupervisor.resolveIntent(intent, resolvedType, userId,
            0 ,computeResolveFilterUid(callingUid, realCallingUid, mRequest.filterCallingUid));
	//rInfo不为null
    if (rInfo == null) {
		//略
    }
    ActivityInfo aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags, profilerInfo);
    synchronized (mService) {
        final ActivityStack stack = mSupervisor.mFocusedStack;
        stack.mConfigWillChange = globalConfig != null
                && mService.getGlobalConfiguration().diff(globalConfig) != 0;
        final long origId = Binder.clearCallingIdentity();
		//aInfo不为null,但后面的不满足
        if (aInfo != null &&
                (aInfo.applicationInfo.privateFlags
                        & ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) != 0 &&
                mService.mHasHeavyWeightFeature) {
			//略
        }
        final ActivityRecord[] outRecord = new ActivityRecord[1];
		//[重]进入startActivity
        int res = startActivity(caller, intent, ephemeralIntent, resolvedType, aInfo, rInfo,
                voiceSession, voiceInteractor, resultTo, resultWho, requestCode, callingPid,
                callingUid, callingPackage, realCallingPid, realCallingUid, startFlags, options,
                ignoreTargetSecurity, componentSpecified, outRecord, inTask, reason,
                allowPendingRemoteAnimationRegistryLookup);

        Binder.restoreCallingIdentity(origId);
		//false
        if (stack.mConfigWillChange) {
			//略
        }
		// outResult 为null,
        if (outResult != null) {
			//略
        }
        mSupervisor.getActivityMetricsLogger().notifyActivityLaunched(res, outRecord[0]);
        return res;
    }
}
startActivity()
private int startActivity(IApplicationThread caller, Intent intent, Intent ephemeralIntent,
        String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo,
        IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
        IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid,
        String callingPackage, int realCallingPid, int realCallingUid, int startFlags,
        SafeActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified,
        ActivityRecord[] outActivity, TaskRecord inTask, String reason,
        boolean allowPendingRemoteAnimationRegistryLookup) {
	//略
	//[重]startActivity
	//mLastStartActivityResult = 0 表示成功
    mLastStartActivityResult = startActivity(caller, intent, ephemeralIntent, resolvedType,
            aInfo, rInfo, voiceSession, voiceInteractor, resultTo, resultWho, requestCode,
            callingPid, callingUid, callingPackage, realCallingPid, realCallingUid, startFlags,
            options, ignoreTargetSecurity, componentSpecified, mLastStartActivityRecord,
            inTask, allowPendingRemoteAnimationRegistryLookup);
	//outActivity不等于null
    if (outActivity != null) {
        outActivity[0] = mLastStartActivityRecord[0];
    }
    return getExternalResult(mLastStartActivityResult);
}
startActivity()
private int startActivity(IApplicationThread caller, Intent intent, Intent ephemeralIntent,
        String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo,
        IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
        IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid,
        String callingPackage, int realCallingPid, int realCallingUid, int startFlags,
        SafeActivityOptions options,
        boolean ignoreTargetSecurity, boolean componentSpecified, ActivityRecord[] outActivity,
        TaskRecord inTask, boolean allowPendingRemoteAnimationRegistryLookup) {
    int err = ActivityManager.START_SUCCESS;
    final Bundle verificationBundle
            = options != null ? options.popAppVerificationBundle() : null;
    ProcessRecord callerApp = null;
	//caller不为null
    if (caller != null) {
        callerApp = mService.getRecordForAppLocked(caller);
		//调用者Pid和UI,也就是启动Activity的应用的
        if (callerApp != null) {
            callingPid = callerApp.pid;
            callingUid = callerApp.info.uid;
        } else {
            err = ActivityManager.START_PERMISSION_DENIED;
        }
    }
	//略,细节不关心,直接看下面
    return startActivity(r, sourceRecord, voiceSession, voiceInteractor, startFlags,
            true /* doResume */, checkedOptions, inTask, outActivity);
}
startActivity()
private int startActivity(final ActivityRecord r, ActivityRecord sourceRecord,
            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
            int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask,
            ActivityRecord[] outActivity) {
    int result = START_CANCELED;
    try {
        mService.mWindowManager.deferSurfaceLayout();
		//r是启动Activity的信息
		//[重]进入startActivityUnchecked
        result = startActivityUnchecked(r, sourceRecord, voiceSession, voiceInteractor,
                startFlags, doResume, options, inTask, outActivity);
    } finally {
        final ActivityStack stack = mStartActivity.getStack();
		//stack不为null, result=0
        if (!ActivityManager.isStartResultSuccessful(result) && stack != null) {
            stack.finishActivityLocked(mStartActivity, RESULT_CANCELED,
                    null /* intentResultData */, "startActivity", true /* oomAdj */);
        }
        mService.mWindowManager.continueSurfaceLayout();
    }
    postStartActivityProcessing(r, result, mTargetStack);
    return result;
}
startActivityUnchecked()
private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,
        IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
        int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask,
        ActivityRecord[] outActivity) {
	//略
	//不为null,packageName就是启动的包名
    if (mStartActivity.packageName == null) {
		//略
        return START_CLASS_NOT_FOUND;
    }
	//略
	//dontStart 为false
	if (dontStart) {
		//略
        return START_DELIVERED_TO_TOP;
    }
	//略
	//mDoResume为true
    if (mDoResume) {
		Slog.e(TAG, "startActivityUnchecked(24) start topRunningActivityLocked : ");
        final ActivityRecord topTaskActivity =
                mStartActivity.getTask().topRunningActivityLocked();
		//mTargetStack.isFocusable()为true
		// mStartActivity== topTaskActivity,都是启动Activity
		if (!mTargetStack.isFocusable()
                || (topTaskActivity != null && topTaskActivity.mTaskOverlay
                && mStartActivity != topTaskActivity)) {
				//略
        } else {
            if (mTargetStack.isFocusable() && !mSupervisor.isFocusedStack(mTargetStack)) {
                mTargetStack.moveToFront("startActivityUnchecked");
            }
			//[重]resumeFocusedStackTopActivityLocked
            mSupervisor.resumeFocusedStackTopActivityLocked(mTargetStack, mStartActivity,
                    mOptions);
        }
    } else if (mStartActivity != null) {
        mSupervisor.mRecentTasks.add(mStartActivity.getTask());
    }
    mSupervisor.updateUserStackLocked(mStartActivity.userId, mTargetStack);
    mSupervisor.handleNonResizableTaskIfNeeded(mStartActivity.getTask(), preferredWindowingMode,
            preferredLaunchDisplayId, mTargetStack);
    return START_SUCCESS;
}

ActivityStackSupervisor.java

resumeFocusedStackTopActivityLocked()
boolean resumeFocusedStackTopActivityLocked(
        ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {
	//readyToResume()为true
    if (!readyToResume()) {
        return false;
    }
	//targetStack不为null,isFocusedStack()为true
	if (targetStack != null && isFocusedStack(targetStack)) {
		//[重]走这里
        return targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
    }
	//略
    return false;
}

ActivityStack.java

resumeTopActivityUncheckedLocked()
@GuardedBy("mService")
boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {
	// false,所以不进入这里,走下面
	if (mStackSupervisor.inResumeTopActivity) {
        return false;
    }
    boolean result = false;
    try {
        mStackSupervisor.inResumeTopActivity = true;
		//进入这里
        result = resumeTopActivityInnerLocked(prev, options);
        final ActivityRecord next = topRunningActivityLocked(true /* focusableOnly */);
		//next不等于null, next.canTurnScreenOn()= false
        if (next == null || !next.canTurnScreenOn()) {
            checkReadyForSleep();
        }
    } finally {
        mStackSupervisor.inResumeTopActivity = false;
    }
    return result;
}
resumeTopActivityInnerLocked()
private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {
	//mBooting = false, mBooted = true
	if (!mService.mBooting && !mService.mBooted) {
        return false;
    }
    final ActivityRecord next = topRunningActivityLocked(true /* focusableOnly */);
	//next不为null
    final boolean hasRunningActivity = next != null;
	// hasRunningActivity = true, isAttached() = true
	if (hasRunningActivity && !isAttached()) {
        return false;
    }
    mStackSupervisor.cancelInitializingActivities();
    boolean userLeaving = mStackSupervisor.mUserLeaving;
    mStackSupervisor.mUserLeaving = false;
	//hasRunningActivity 为true
    if (!hasRunningActivity) {
        return resumeTopActivityInNextFocusableStack(prev, options, "noMoreActivities");
    }
	//略
    mStackSupervisor.mStoppingActivities.remove(next);
    mStackSupervisor.mGoingToSleepActivities.remove(next);
    next.sleeping = false;
    mStackSupervisor.mActivitiesWaitingForVisibleActivity.remove(next);
	//略
	mStackSupervisor.setLaunchSource(next.info.applicationInfo.uid);
	//略
	//[重],这回先暂停上一个activity
	//也就是Launcher的Activity进入Pause周期
	//进入pauseBackStacks()分析
    boolean pausing = mStackSupervisor.pauseBackStacks(userLeaving, next, false);
	// mResumedActivity 为 null,不进入
    if (mResumedActivity != null) {
        pausing |= startPausingLocked(userLeaving, false, next, false);
    }
	//pausing = true , resumeWhilePausing = false 进入
    if (pausing && !resumeWhilePausing) {
		//符合条件[Skip resume: need to start pausing]
        if (next.app != null && next.app.thread != null) {
            mService.updateLruProcessLocked(next.app, true, null);
        }
        if (lastResumed != null) {
            lastResumed.setWillCloseOrEnterPip(true);
        }
        return true;
    } else if (mResumedActivity == next && next.isState(RESUMED)
            && mStackSupervisor.allResumedActivitiesComplete()) {
        executeAppTransition(options);
        return true;
    }
	//略
	//上面退出去了,这里暂时不走,后面会走这里
    return true;
}

ActivityStackSupervisor.java

pauseBackStacks()
boolean pauseBackStacks(boolean userLeaving, ActivityRecord resuming, boolean dontWait) {
	//userLeaving=true
	//resuming 需要启动的Activity
	//dontWait false
    boolean someActivityPaused = false;
    for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
        final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx);
        for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) {
            final ActivityStack stack = display.getChildAt(stackNdx);
            if (!isFocusedStack(stack) && stack.getResumedActivity() != null) {
				//从Launcher界面启动,此时Activity处于resume周期,需要pause
                someActivityPaused |= stack.startPausingLocked(userLeaving, false, resuming,
                        dontWait);
            }
        }
    }
	// true
    return someActivityPaused;
}

ActivityStack.java

final boolean startPausingLocked(boolean userLeaving, boolean uiSleeping,
        ActivityRecord resuming, boolean pauseImmediately) {
    // mPausingActivity = null
    if (mPausingActivity != null) {
        if (!shouldSleepActivities()) {
            completePauseLocked(false, resuming);
        }
    }
    ActivityRecord prev = mResumedActivity;
	//prev 不为null,就是Launcher的Activity
    if (prev == null) {
        if (resuming == null) {
            mStackSupervisor.resumeFocusedStackTopActivityLocked();
        }
        return false;
    }
	//resuming 启动的Activity,不相等
    if (prev == resuming) {
        return false;
    }
    mPausingActivity = prev;
    mLastPausedActivity = prev;
    mLastNoHistoryActivity = (prev.intent.getFlags() & Intent.FLAG_ACTIVITY_NO_HISTORY) != 0
            || (prev.info.flags & ActivityInfo.FLAG_NO_HISTORY) != 0 ? prev : null;
    prev.setState(PAUSING, "startPausingLocked");
    prev.getTask().touchActiveTime();
    clearLaunchTime(prev);
    mStackSupervisor.getLaunchTimeTracker().stopFullyDrawnTraceIfNeeded(getWindowingMode());
    mService.updateCpuStats();
	//prev是Launcher的Activity信息,满足下面条件
    if (prev.app != null && prev.app.thread != null) {
        try {
            EventLogTags.writeAmPauseActivity(prev.userId, System.identityHashCode(prev),
                    prev.shortComponentName, "userLeaving=" + userLeaving);
            mService.updateUsageStats(prev, false);
			//[重] mService.getLifecycleManager() 应该获取的是。。。。
            mService.getLifecycleManager().scheduleTransaction(prev.app.thread, prev.appToken,
                    PauseActivityItem.obtain(prev.finishing, userLeaving,
                            prev.configChangeFlags, pauseImmediately));
        } catch (Exception e) {
            mPausingActivity = null;
            mLastPausedActivity = null;
            mLastNoHistoryActivity = null;
        }
    } else {
        mPausingActivity = null;
        mLastPausedActivity = null;
        mLastNoHistoryActivity = null;
    }
    if (!uiSleeping && !mService.isSleepingOrShuttingDownLocked()) {
        mStackSupervisor.acquireLaunchWakelock();
    }
	//mPausingActivity不为null,上面赋值了
    if (mPausingActivity != null) {
		//uiSleeping = false
        if (!uiSleeping) {
            prev.pauseKeyDispatchingLocked();
        } else if (true) {
             Slog.v(TAG, "Key dispatch not paused for screen off");
        }
		//pauseImmediately =  false
        if (pauseImmediately) {
            completePauseLocked(false, resuming);
            return false;
        } else {
			//这里返回
            schedulePauseTimeout(prev);
            return true;
        }

    } else {
		//略
        return false;
    }
}

上面的关注点是

  1. 调用了ClientLifecycleManager.scheduleTransaction()

  2. 第三个参数是PauseActivityItem对象

mService.getLifecycleManager().scheduleTransaction(prev.app.thread, prev.appToken,
      PauseActivityItem.obtain(prev.finishing, userLeaving,
          prev.configChangeFlags, pauseImmediately));

ClientLifecycleManager.java

scheduleTransaction()

三个参数的

void scheduleTransaction(@NonNull IApplicationThread client, @NonNull IBinder activityToken,
        @NonNull ActivityLifecycleItem stateRequest) throws RemoteException {
    //通过transactionWithState()创建了clientTransaction对象
    //stateRequest就是传入的PauseActivityItem对象
    //[1]
    final ClientTransaction clientTransaction = transactionWithState(client, activityToken,
            stateRequest);
    //[2]
    scheduleTransaction(clientTransaction);
}
transactionWithState()
private static ClientTransaction transactionWithState(@NonNull IApplicationThread client,
        @NonNull IBinder activityToken, @NonNull ActivityLifecycleItem stateRequest) {
    final ClientTransaction clientTransaction = ClientTransaction.obtain(client, activityToken);
    //stateRequest就是传入的PauseActivityItem对象
    clientTransaction.setLifecycleStateRequest(stateRequest);
    return clientTransaction;
}
scheduleTransaction()
void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
    final IApplicationThread client = transaction.getClient();
    //调用schedule()
    transaction.schedule();
    if (!(client instanceof Binder)) {
        transaction.recycle();
    }
}

ClientTransaction.java

schedule()
public void schedule() throws RemoteException {
	//mClient是一个IApplicationThread类型,
	//ActivityThread的内部类ApplicationThread派生这个接口类并实现了对应的方法。
    mClient.scheduleTransaction(this);
}

ActivityThread.java

scheduleTransaction()
@Override
public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
	//调用的是ActivityThread的方法,但没有实现
	//子债父还,找父类ClientTransactionHandler
    ActivityThread.this.scheduleTransaction(transaction);
}

ClientTransactionHandler.java

ClientTransactionHandler是个抽象类,部分方法实现需要看子类。

scheduleTransaction()
void scheduleTransaction(ClientTransaction transaction) {
	//ClientTransaction调用preExecute
	//这里不太懂[暂时略过]
    transaction.preExecute(this);
	//子类ActivityThread实现,发送EXECUTE_TRANSACTION
    sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
}

ActivityThread.java

sendMessage()
void sendMessage(int what, Object obj) {
    sendMessage(what, obj, 0, 0, false);
}

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);
}
handleMessage()
public void handleMessage(Message msg) {
        switch (msg.what) {
            case BIND_APPLICATION:
                Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "bindApplication");
                AppBindData data = (AppBindData)msg.obj;
                handleBindApplication(data);
                Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                break;
			//略
            case EXECUTE_TRANSACTION:
                final ClientTransaction transaction = (ClientTransaction) msg.obj;
                //[重]
                mTransactionExecutor.execute(transaction);
                if (isSystem()) {
                    transaction.recycle();
                }
                break;
        }
        Object obj = msg.obj;
        if (obj instanceof SomeArgs) {
            ((SomeArgs) obj).recycle();
        }
    }
}

TransactionExecutor.java

execute()
public void execute(ClientTransaction transaction) {
    final IBinder token = transaction.getActivityToken();
    //略过
    executeCallbacks(transaction);
    //重点关注
    executeLifecycleState(transaction);
    mPendingActions.clear();
}
executeLifecycleState()
private void executeLifecycleState(ClientTransaction transaction) {
    final ActivityLifecycleItem lifecycleItem = transaction.getLifecycleStateRequest();
	//不为null,是PauseActivityItem对象
    if (lifecycleItem == null) {
        return;
    }
    final IBinder token = transaction.getActivityToken();
    final ActivityClientRecord r = mTransactionHandler.getActivityClient(token);
	//不等于null,这里指的Launcher的Activity
    if (r == null) {
        return;
    }
    cycleToPath(r, lifecycleItem.getTargetState(), true /* excludeLastState */);
	//PauseActivityItem对象,execute
    lifecycleItem.execute(mTransactionHandler, token, mPendingActions);
	//PauseActivityItem对象,postExecute
    lifecycleItem.postExecute(mTransactionHandler, token, mPendingActions);
}

PauseActivityItem.java

这里先附上

execute()
@Override
public void execute(ClientTransactionHandler client, IBinder token,
        PendingTransactionActions pendingActions) {
	//client是ActivityThread对象
    client.handlePauseActivity(token, mFinished, mUserLeaving, mConfigChanges, pendingActions,
            "PAUSE_ACTIVITY_ITEM");
}
postExecute()
@Override
public void postExecute(ClientTransactionHandler client, IBinder token,
        PendingTransactionActions pendingActions) {
    //mDontReport=false
    if (mDontReport) {
        return;
    }
    try {
		//执行ActivityManagerService.activityPaused
        ActivityManager.getService().activityPaused(token);
    } catch (RemoteException ex) {
        throw ex.rethrowFromSystemServer();
    }
}

先分析execute(),后分析postExecute(),这里单独分开,后面再回到这里哈。

ActivityThread.java

先分析上面execute()中调用的

handlePauseActivity()
@Override
public void handlePauseActivity(IBinder token, boolean finished, boolean userLeaving,
        int configChanges, PendingTransactionActions pendingActions, String reason) {
    ActivityClientRecord r = mActivities.get(token);
    //r不为null
    if (r != null) {
    	// true
        if (userLeaving) {
            performUserLeavingActivity(r);
        }
        r.activity.mConfigChangeFlags |= configChanges;
		//finished = false
		//reason = PAUSE_ACTIVITY_ITEM
        performPauseActivity(r, finished, reason, pendingActions);
		//r.isPreHoneycomb() false
        if (r.isPreHoneycomb()) {
            QueuedWork.waitToFinish();
        }
        mSomeActivitiesChanged = true;
    }
}
performPauseActivity()
final Bundle performPauseActivity(IBinder token, boolean finished, String reason,
        PendingTransactionActions pendingActions) {
    ActivityClientRecord r = mActivities.get(token);
    return r != null ? performPauseActivity(r, finished, reason, pendingActions) : null;
}
performPauseActivity()
private Bundle performPauseActivity(ActivityClientRecord r, boolean finished, String reason,
        PendingTransactionActions pendingActions) {
	//r.paused false 还没启动完,肯定还没暂停成功
    if (r.paused) {
    	//略
    }
	//false
    if (finished) {
        r.activity.mFinished = true;
    }
    final boolean shouldSaveState = !r.activity.mFinished && r.isPreHoneycomb();
	//false
    if (shouldSaveState) {
        callActivityOnSaveInstanceState(r);
    }
    //执行pause
    performPauseActivityIfNeeded(r, reason);
	//略
    return shouldSaveState ? r.state : null;
}
performPauseActivityIfNeeded()
private void performPauseActivityIfNeeded(ActivityClientRecord r, String reason) {
	//此时没有暂停
    if (r.paused) {
        return;
    }
    try {
        r.activity.mCalled = false;
        //[重]这里call暂停
        mInstrumentation.callActivityOnPause(r.activity);
	   //略
    } catch (SuperNotCalledException e) {
    	//略
    }
    r.setState(ON_PAUSE);
}

Instrumentation.java

callActivityOnPause()
public void callActivityOnPause(Activity activity) {
    activity.performPause();
}

activity是Launcher的Activity,也就是当前界面

Activity.java

performPause()
final void performPause() {
    mDoReportFullyDrawn = false;
    mFragments.dispatchPause();
    mCalled = false;
    //执行onPause()周期
    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()");
    }
}

至此,Launcher的Activity进入后台了,也就执行了onPause()周期。

我们返回上面postExecute()分析,调用的是

 //ActivityManagerService.activityPaused()
 ActivityManager.getService().activityPaused(token);

ActivityManagerService.java

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

ActivityStack.java

activityPausedLocked()
final void activityPausedLocked(IBinder token, boolean timeout) {
    final ActivityRecord r = isInStackLocked(token);
	//r不为null,也就是Launcher的Activity
    if (r != null) {
        mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r);
		//相等
        if (mPausingActivity == r) {
            mService.mWindowManager.deferSurfaceLayout();
            try {
				//表示完成paused状态
                completePauseLocked(true /* resumeNext */, null /* resumingActivity */);
            } finally {
                mService.mWindowManager.continueSurfaceLayout();
            }
            //这里直接返回了
            return;
        } else {
		   //略
        }
    }
    //略
}
completePauseLocked()
private void completePauseLocked(boolean resumeNext, ActivityRecord resuming) {
    ActivityRecord prev = mPausingActivity;
    //pre就是暂停的Activity
    if (prev != null) {
		//略
    }
	//传入的是true
    if (resumeNext) {
        final ActivityStack topStack = mStackSupervisor.getFocusedStack();
        if (!topStack.shouldSleepOrShutDownActivities()) {
			//[重1]
            mStackSupervisor.resumeFocusedStackTopActivityLocked(topStack, prev, null);
        } else {
			//略
        }
    }
	//略
    if (mStackSupervisor.mAppVisibilitiesChangedSinceLastPause
            || getDisplay().hasPinnedStack()) {
        mService.mTaskChangeNotificationController.notifyTaskStackChanged();
        mStackSupervisor.mAppVisibilitiesChangedSinceLastPause = false;
    }
    //[重2]
    mStackSupervisor.ensureActivitiesVisibleLocked(resuming, 0, !PRESERVE_WINDOWS);
}

ActivityStackSupervisor.java

resumeFocusedStackTopActivityLocked()

这个方法之前走过的,又回来了。

boolean resumeFocusedStackTopActivityLocked(
        ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {
	//readyToResume() 为true
    if (!readyToResume()) {
        return false;
    }
	//targetStack不为null; isFocusedStack()为true,因此进入
	if (targetStack != null && isFocusedStack(targetStack)) {
		//走这里
        return targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
    }
	//略
    return false;
}

ActivityStack.java

resumeTopActivityUncheckedLocked()
@GuardedBy("mService")
boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {
	// false
	if (mStackSupervisor.inResumeTopActivity) {
        // Don't even start recursing.
        return false;
    }

    boolean result = false;
    try {
        mStackSupervisor.inResumeTopActivity = true;
		//进入这里
        result = resumeTopActivityInnerLocked(prev, options);
        final ActivityRecord next = topRunningActivityLocked(true /* focusableOnly */);
		//next不等于null,next.canTurnScreenOn()= false
        if (next == null || !next.canTurnScreenOn()) {
            checkReadyForSleep();
        }
    } finally {
        mStackSupervisor.inResumeTopActivity = false;
    }
    return result;
}
resumeTopActivityInnerLocked()
@GuardedBy("mService")
private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {
	//mBooting = false, mBooted = true
	if (!mService.mBooting && !mService.mBooted) {
        return false;
    }
	//next不为null,也就是启动的Activity
    final ActivityRecord next = topRunningActivityLocked(true /* focusableOnly */);
	//略
	//上面进入过一次,只不过是暂停Launcher的Activity,
	//此时Launcher的Activity进入onPause()
	//因此这里返回false,pausing= false
    boolean pausing = mStackSupervisor.pauseBackStacks(userLeaving, next, false);
	// mResumedActivity为null
    if (mResumedActivity != null) {
        pausing |= startPausingLocked(userLeaving, false, next, false);
    }
	//pausing为false,此时mResumedActivity为null
    if (pausing && !resumeWhilePausing) {
		//略
        return true;
    } else if (mResumedActivity == next && next.isState(RESUMED)
		//略
        return true;
    }
	//略
	//prev是上一个Launcher的Activity
	//next是将启动的Activity
    if (prev != null && prev != next) {
        if (!mStackSupervisor.mActivitiesWaitingForVisibleActivity.contains(prev)
                && next != null && !next.nowVisible) {
			//进入这里
            mStackSupervisor.mActivitiesWaitingForVisibleActivity.add(prev);
        } else {
			//略
        }
    }

    // Launching this app's activity, make sure the app is no longer
    // considered stopped.
    try {
	    //设置启动包名为停止状态,上面有英文注释
        AppGlobals.getPackageManager().setPackageStoppedState(
                next.packageName, false, next.userId); /* TODO: Verify if correct userid */
    } catch (RemoteException e1) {
		//略
	}
	//prev 不为null
    if (prev != null) {
		// prev.finishing = false
        if (prev.finishing) {
            //略
        } else {
            if (mStackSupervisor.mNoAnimActivities.contains(next)) {
                anim = false;
                mWindowManager.prepareAppTransition(TRANSIT_NONE, false);
            } else {
				//走这里,准备app转换过度吧
                mWindowManager.prepareAppTransition(prev.getTask() == next.getTask()
                        ? TRANSIT_ACTIVITY_OPEN
                        : next.mLaunchTaskBehind
                                ? TRANSIT_TASK_OPEN_BEHIND
                                : TRANSIT_TASK_OPEN, false);
            }
        }
    } else {
		//略
    }
	// anim 为true
    if (anim) {
        next.applyOptionsLocked();
    } else {
        next.clearOptionsLocked();
    }
	//略
	//next还没启动,因此为null
    if (next.app != null && next.app.thread != null) {
		//略,如果之前启动过,会走这里
    } else {
		// next.hasBeenLaunched 为false
        if (!next.hasBeenLaunched) {
            next.hasBeenLaunched = true;
        } else {
			//略
        }
		//走这里
        mStackSupervisor.startSpecificActivityLocked(next, true, true);
    }
    return true;
}

ActivityStackSupervisor.java

startSpecificActivityLocked()
void startSpecificActivityLocked(ActivityRecord r,
        boolean andResume, boolean checkConfig) {
	//通过包名进行获取进程记录
    ProcessRecord app = mService.getProcessRecordLocked(r.processName,
            r.info.applicationInfo.uid, true);
    getLaunchTimeTracker().setLaunchTime(r);
	// pp为null,因为还没启动过呢
    if (app != null && app.thread != null) {
		//略
    }
	//启动进程。
    mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
            "activity", r.intent.getComponent(), false, false, true);
}

ActivityManagerService.java

startProcessLocked()
@GuardedBy("this")
final ProcessRecord startProcessLocked(String processName,
        ApplicationInfo info, boolean knownToBeDead, int intentFlags,
        String hostingType, ComponentName hostingName, boolean allowWhileBooting,
        boolean isolated, boolean keepIfLarge) {
    return startProcessLocked(processName, info, knownToBeDead, intentFlags, hostingType,
            hostingName, allowWhileBooting, isolated, 0 /* isolatedUid */, keepIfLarge,
            null /* ABI override */, null /* entryPoint */, null /* entryPointArgs */,
            null /* crashHandler */);
}
startProcessLocked()
@GuardedBy("this")
final ProcessRecord startProcessLocked(String processName, ApplicationInfo info,
        boolean knownToBeDead, int intentFlags, String hostingType, ComponentName hostingName,
        boolean allowWhileBooting, boolean isolated, int isolatedUid, boolean keepIfLarge,
        String abiOverride, String entryPoint, String[] entryPointArgs, Runnable crashHandler) {
    long startTime = SystemClock.elapsedRealtime();
    ProcessRecord app;
	//false
    if (!isolated) {
        app = getProcessRecordLocked(processName, info.uid, keepIfLarge);

        checkTime(startTime, "startProcess: after getProcessRecord");

        if ((intentFlags & Intent.FLAG_FROM_BACKGROUND) != 0) {
			//略
        } else {
            mAppErrors.resetProcessCrashTimeLocked(info);
            if (mAppErrors.isBadProcessLocked(info)) {
				//略
            }
        }
    } else {
        app = null;
    }
	//app=null, pid=-1
    if (app != null && app.pid > 0) {
		//略
    }
    String hostingNameStr = hostingName != null
            ? hostingName.flattenToShortString() : null;
    if (app == null) {
        checkTime(startTime, "startProcess: creating new process record");
		//创建新的ProcessRecord
        app = newProcessRecordLocked(info, processName, isolated, isolatedUid);
		//不为null
        if (app == null) {
            return null;
        }
        app.crashHandler = crashHandler;
        app.isolatedEntryPoint = entryPoint;
        app.isolatedEntryPointArgs = entryPointArgs;
        checkTime(startTime, "startProcess: done creating new process record");
    } else {
        app.addPackage(info.packageName, info.versionCode, mProcessStats);
        checkTime(startTime, "startProcess: added package to existing proc");
    }
	//mProcessesReady true
    if (!mProcessesReady
            && !isAllowedWhileBooting(info)
            && !allowWhileBooting) {

        if (!mProcessesOnHold.contains(app)) {
            mProcessesOnHold.add(app);
        }
        checkTime(startTime, "startProcess: returning with proc on hold");
        return app;
    }
    checkTime(startTime, "startProcess: stepping in to startProcess");
	// success = true
	//正常情况下,都会创建成功,具体略过,有兴趣的可以跟哈
    final boolean success = startProcessLocked(app, hostingType, hostingNameStr, abiOverride);
    checkTime(startTime, "startProcess: done starting proc!");
    return success ? app : null;
}

至此,正常情况下app,最后在startProcessLocked()下面调用startProcess(),后面懒得跟了。

最后新的进程启动和绑定等下回介绍哈。

说实话,确实很绕,晕头转向的。

参考文章

 历史上的今天

  1. 2021: ijkplayer 初始化参数 IJKFFOptions(0条评论)
  2. 2019: 三毛:胆小鬼(0条评论)
  3. 2018: Internet时间同步服务器地址(0条评论)
  4. 2018: [转]android NTP时间同步(0条评论)
版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com[备用域名]
3、 本站内容: 部分来源于网络,仅供站长学习和参考,若侵权请留言

暂无评论

暂无评论...

随机推荐

JNI之自定义对象使用

前言Java中存在自定义对象的,因此JNI是要考虑传入自定义对象的使用。记录一下,方便自己查阅和学习。正文这里定义一个Staff类,传入JNI中打印和冲JNI中创建返回给Java。还是在之前动态注册的基础上改。如果没有基础,可以看看《JNI动态注册》Staff.java# @站长pa...

jaudiotagger解析ID3第四版

前言前面介绍过《jaudiotagger解析ID3第三版》,然后后面又继续优化。当然,效果跟第三版差不多,但个人觉得写法更好,记录于此,方便自己查阅。阅读jaudiotagger源码进行对之前的代码优化。正文导入jaudiotagger.jar导入lib库/libs/jaudiotag...

PHP中检查url是否可以正常访问

一个链接是否可以正常访问:方法一:array get_headers( string $url[, int $format = 0] )url: 目标 URL。format: 如果将可选的 format 参数设为 1,则 get_headers() 会解析相应的信息并设定数组的键名。返回:...

[摘]CMakeLists.txt常用语法之常用命令

前言cmake 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。正文下面介绍常用的命令制定cmake最小版本cmake_minimum_required(VERSION 3.4.1)这行命令是可选的...

[摘]System.exit(0)和System.exit(1)区别

原作者解释得很清晰明,因此摘抄于此。关于System.exit(status)System.exit(status)源码说明如下:System.java/** * Terminates the currently running Java Virtual Machine. The * ...

吴念真:年糕

阿旺和我读同一个小学,低我两个年级,所以之前我并不认识他,不过他倒知道我,因为小学时代我是学校升降旗典礼的司仪。遇见他的时候,我已经十七岁,他十五岁,两个人都已经在台北工作了。阿旺做事的铁工厂和我住的地方其实就在同一条巷子里,只是没碰过面,直到有一天房东叫铁工来装铁窗,扛着铁架的小助手看看我,...