源码分析: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 IActivityManagerSingleton =
            new Singleton() {
                @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 pendingResults, List 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生命周期调用顺序(二)

你可能感兴趣的:(Android-源码分析)