源碼分析:Activity生命週期調用順序(一)

我們一般打開一個新的Activity,都會調用**startActivity(Intent)**。 新的Activity的生命週期就開始被調用了。 下面,我們就從**Activity.startActivity**開始,看下源碼是怎麼一步步的調用新啓動的Activity的聲明週期的。

先放一個完整的時序圖
Activity執行流程,第一部分

現在開始分析

startActivity(Intent)

public class Activity extends ...{
	...
    @Override
    public void startActivity(Intent intent) {
        this.startActivity(intent, null);
    }
	...
	 @Override
    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);
        }
    }
	...
	    public void startActivityForResult(@RequiresPermission Intent intent, int requestCode) {
        startActivityForResult(intent, requestCode, null);
    }
	...
 public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
            @Nullable Bundle options) {
            options = transferSpringboardActivityOptions(options);
			//調用Instrumentation.execStartActivity()方法
            Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode, options);

           //代碼省略
    }


}

通過上面代碼調用,我們可以看到。它的調用順序。
1,startActivity()
2,…startActivity()方法的各種重載
3,startActivityForResult()
4,Instrumentation.execStartActivity()

下面,看下Instrumentation.execStartActivity()都做了什麼

Instrumentation.execStartActivity()

public ActivityResult execStartActivity(
            Context who, IBinder contextThread, IBinder token, Activity target,
            Intent intent, int requestCode, Bundle options) {
		...
		//省略代碼
        try {
            intent.migrateExtraStreamToClipData();
            intent.prepareToLeaveProcess(who);
			//這裏執行了 ActivityManager.getService()的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;
    }

這裏執行了 :
ActivityManager.getService().startActivity()方法。

先看下ActivityManager.getService()方法返回的對象是什麼。

public class ActivityManager{

    public static IActivityManager getService() {
        return IActivityManagerSingleton.get();
    }
    private static final Singleton<IActivityManager> IActivityManagerSingleton =
            new Singleton<IActivityManager>() {
                @Override
                protected IActivityManager create() {
                    final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
                    final IActivityManager am = IActivityManager.Stub.asInterface(b);
                    return am;
                }
            };
}

首先,這裏用了一個單例。
然後,是通過IPC通信,最終拿到的對象其實是ActivityManagerService(AMS)。

這裏總結下上面的調用順序:
1,Instrumentation.execStartActivity()方法
2,ActivityManager.getService().startActivity()方法
3,ActivityManagerService.startActivity()方法。

下面,看下ActivityManagerService.startActivity()方法。

ActivityManagerService.startActivity()方法

public class ActivityManagerService{

	...

	    @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) {
		//調用startActivityAsUser()方法
        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) {
        enforceNotIsolatedCaller("startActivity");
        userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
                userId, false, ALLOW_FULL_ONLY, "startActivity", null);
        // TODO: Switch to user app stacks here.
		//調用ActivityStarter的startActivityMayWait()方法
        return mActivityStarter.startActivityMayWait(caller, -1, callingPackage, intent,
                resolvedType, null, null, resultTo, resultWho, requestCode, startFlags,
                profilerInfo, null, null, bOptions, false, userId, null, null,
                "startActivityAsUser");
    }
	
	...
	

}

這裏的一系列調用,最後走到了ActivityStarter的startActivityMayWait()方法

  final 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, Bundle bOptions, boolean ignoreTargetSecurity, int userId,
            IActivityContainer iContainer, TaskRecord inTask, String reason) {
			
			...
			
            final ActivityRecord[] outRecord = new ActivityRecord[1];
			//調用startActivityLocked
            int res = startActivityLocked(caller, intent, ephemeralIntent, resolvedType,
                    aInfo, rInfo, voiceSession, voiceInteractor,
                    resultTo, resultWho, requestCode, callingPid,
                    callingUid, callingPackage, realCallingPid, realCallingUid, startFlags,
                    options, ignoreTargetSecurity, componentSpecified, outRecord, container,
                    inTask, reason);


			...
            
			return res;
        }
    }

	...
	
int startActivityLocked(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,
            ActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified,
            ActivityRecord[] outActivity, ActivityStackSupervisor.ActivityContainer container,
            TaskRecord inTask, String reason) {
			
		...
		
		//調用startAcctivity()方法
        mLastStartActivityResult = startActivity(caller, intent, ephemeralIntent, resolvedType,
                aInfo, rInfo, voiceSession, voiceInteractor, resultTo, resultWho, requestCode,
                callingPid, callingUid, callingPackage, realCallingPid, realCallingUid, startFlags,
                options, ignoreTargetSecurity, componentSpecified, mLastStartActivityRecord,
                container, inTask);

		...

        return mLastStartActivityResult;
    }

...

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,
            ActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified,
            ActivityRecord[] outActivity, ActivityStackSupervisor.ActivityContainer container,
            TaskRecord inTask) {
       	
		...

	
		//調用重載startActivity(),下面
        return startActivity(r, sourceRecord, voiceSession, voiceInteractor, startFlags, true,
                options, inTask, outActivity);
    }

...

 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();
			//調用startActivityUnchecked()方法,下面
            result = startActivityUnchecked(r, sourceRecord, voiceSession, voiceInteractor,
                    startFlags, doResume, options, inTask, outActivity);
        } finally {
            // If we are not able to proceed, disassociate the activity from the task. Leaving an
            // activity in an incomplete state can lead to issues, such as performing operations
            // without a window container.
            if (!ActivityManager.isStartResultSuccessful(result)
                    && mStartActivity.getTask() != null) {
                mStartActivity.getTask().removeActivity(mStartActivity);
            }
            mService.mWindowManager.continueSurfaceLayout();
        }

        postStartActivityProcessing(r, result, mSupervisor.getLastStack().mStackId,  mSourceRecord,
                mTargetStack);

        return result;
    }

...

private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,
            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
            int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask,
            ActivityRecord[] outActivity) {

		...
   		
		//調用ActivityStackSupervisor的startActivityLocked()方法,下面
        mSupervisor.resumeFocusedStackTopActivityLocked(mTargetStack, mStartActivity,
                        mOptions);

		...

        return START_SUCCESS;
    }


public class ActivityStackSupervisor{

	...
	
 	boolean resumeFocusedStackTopActivityLocked(
            ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {
        if (targetStack != null && isFocusedStack(targetStack)) {
			//調用ActivityStack的resumeTopActivityUncheckedLocked()方法
            return targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
        }
        final ActivityRecord r = mFocusedStack.topRunningActivityLocked();
        if (r == null || r.state != RESUMED) {
            mFocusedStack.resumeTopActivityUncheckedLocked(null, null);
        } else if (r.state == RESUMED) {
            // Kick off any lingering app transitions form the MoveTaskToFront operation.
            mFocusedStack.executeAppTransition(targetOptions);
        }
        return false;
    }
}

	...

public class ActivityStack{

boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {
			...

            //調用resumeTopActivityInnerLocked,下面
            result = resumeTopActivityInnerLocked(prev, options);
			
			...

        return result;
    }

}

...

private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {
        
		...
		//調用ActivityStackSupervisor.startSpecificActivityLocked,下面
		mStackSupervisor.startSpecificActivityLocked(next, true, false);

		...



public class ActivityStackSupervisor{

void startSpecificActivityLocked(ActivityRecord r,
            boolean andResume, boolean checkConfig) {
        // Is this activity's application already running?
        ProcessRecord app = mService.getProcessRecordLocked(r.processName,
                r.info.applicationInfo.uid, true);
				
				...
				//這裏調用了realStartActivityLocked()方法,下面
                realStartActivityLocked(r, app, andResume, checkConfig);
                
				...


}

...

final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,
            boolean andResume, boolean checkConfig) throws RemoteException {
			
			
			//這裏的thread是IApplicationThread。
			//通過binder機制,調用的是ApplicationThread的scheduleLaunchActivity
            app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
                    System.identityHashCode(r), r.info,
                    // TODO: Have this take the merged configuration instead of separate global and
                    // override configs.
                    mergedConfiguration.getGlobalConfiguration(),
                    mergedConfiguration.getOverrideConfiguration(), r.compat,
                    r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,
                    r.persistentState, results, newIntents, !andResume,
                    mService.isNextTransitionForward(), profilerInfo);

           ...

        return true;
    }

//ApplicationThread是ActivityThread的一個內部類。先看下ApplicationThread的scheduleLaunchActivity()方法

public class ActivityThread{

	
		private class ApplicationThread extends IApplicationThread.Stub {
			...
			@Override
	        public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
	                ActivityInfo info, Configuration curConfig, Configuration overrideConfig,
	                CompatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor,
	                int procState, Bundle state, PersistableBundle persistentState,
	                List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
	                boolean notResumed, boolean isForward, ProfilerInfo profilerInfo) {
					...
					
					//這裏調用了ActivityThread的sendMessage()方法
					//message.what是H.LAUNCH_ACTIVITY
	            	sendMessage(H.LAUNCH_ACTIVITY, r);
	        }
			
			...

        }

		}

	
	private 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);
        }
		//發送到ActivityThread 內部的Handler(H)。
        mH.sendMessage(msg);
    }
}

到這裏,我們知道了,整個流程的最後,是通過發送Message到ActivityThread內部的Handler(H)。
我們看下H的handleMessage()方法,怎麼處理的

public void handleMessage(Message msg) {
            if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));
            switch (msg.what) {
                case LAUNCH_ACTIVITY: {
					...

                    final ActivityClientRecord r = (ActivityClientRecord) msg.obj;

                    r.packageInfo = getPackageInfoNoCheck(
                            r.activityInfo.applicationInfo, r.compatInfo);
					//handleLaunchActivity
                    handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");
					...
                } break;

到這裏,我們看到了。他調用了內部的handleLaunchActivity()方法。下篇文章我們通過這個方法,查看Activity生命週期的每個方法的調用。

源碼分析:Activity生命週期調用順序(二)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章