Activity的启动流程

1.前言

​ Activity作为Android四大天王之一,可以说是第一个接触到的也是日常开发中最常用的组件。系统对Activity的启动,生命周期管理做了很好的封装,使得我们用起来觉得特别方便、简单。但是系统内部又是如何通过intent就能启动一个Activity、又是如何回调各个生命周期方法的。接下来就让我们系好安全带,深入源码去看看这丧心病狂的实现细节。

2.Activity的启动流程

2.1 ActivityThread —> ActivityManagerService

​ 我们平时想要开启一个Activity,通过下面两句实现

Intent intent = new Intent(this,newActivity.class);
startActivity(intent);

startActivity()的源码看出,最终会调用startActivityForResult方法,-1代表不需要返回结果

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);
      }
}

startActivityForResult中会调用mInstrumentation.execStartActivity( )方法

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());
           }
            ...
}

1.Instrumentation

会在应用程序运行之前被实例化,主要用来监视应用程序和系统的所有交互。它还会构造Application,构建Activity,以及生命周期都会经过这个对象去执行.

2.mMainThread

是ActivityThread类型,为应用的主线程,程序的入口.在main方法中开启loop循环,不断地接收消息,处理任务。

3.ApplicationThread

上述代码中通过 mMainThread.getApplicationThread()获得一个ApplicationThread对象,它是Activity的一个内部类,主要用于AMS与应用进程之间的通信。

Instrumentation.execStartActivity

public ActivityResult execStartActivity(
         Context who, IBinder contextThread, IBinder token, Activity target,
         Intent intent, int requestCode, Bundle options) {
    
            IApplicationThread whoThread = (IApplicationThread) contextThread;   
     ...
     
         	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( )方法。

IApplicationThread

一个继承IInterface的接口,因此它是一个Binder类型的接口,其中包含大量启动、停止Activity的方法,它的具体实现类就是我们刚才说到的ApplicationThread

ActivityManager.getService( )返回一个单例的IActivityManager,

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;
            }
        };

IActivityManager

这也是一个Binder接口,具体实现类就是ActivityManagerService

其实这里就是通过进程间通信(AIDL),将启动Activity的任务提交到系统的ActivityManagerService。

2.2 ActivityManagerService --> ApplicationThread

​ 我们首先看看ActivityManagerService.startActivity( )方法

@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) {

    // TODO: Switch to user app stacks here.
    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();

}

startActivity( )中又调用了startActivityAsUser( )方法,最终通过obtainStarter( )方法返回一个ActivityStarter对象,并调用它的execute方法,其中会调用ActivityStarter的startActivityMayWait( )方法。

ActivityStarter

专门负责Activity的启动操作,包括解析Intent、创建ActivityRecord 、TaskRecord

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) {
            ...
            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);
            ...
            return res;
        }
    }

 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) {
        ...
        mLastStartActivityResult = startActivity(caller, intent, ephemeralIntent, 												resolvedType, aInfo, rInfo, voiceSession,                                                 voiceInteractor, resultTo, resultWho, 												requestCode, callingPid, callingUid, 													callingPackage, realCallingPid, realCallingUid, 										startFlags, options, ignoreTargetSecurity, 												componentSpecified, mLastStartActivityRecord,
                i					nTask, allowPendingRemoteAnimationRegistryLookup);
        ...
        return getExternalResult(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,
            SafeActivityOptions options,
            boolean ignoreTargetSecurity, boolean componentSpecified, ActivityRecord[] outActivity,
            TaskRecord inTask, boolean allowPendingRemoteAnimationRegistryLookup) {
        ...
        return startActivity(r, sourceRecord, voiceSession, voiceInteractor, startFlags,
                true /* doResume */, checkedOptions, inTask, outActivity);
    }
    private int startActivity(final ActivityRecord r, ActivityRecord sourceRecord,
                IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
                int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask,
                ActivityRecord[] outActivity) {
        ...
            result = startActivityUnchecked(r, sourceRecord, voiceSession, voiceInteractor,
                    startFlags, doResume, options, inTask, outActivity);
        ...

        postStartActivityProcessing(r, result, mTargetStack);

        return result;
    }

前面一大堆看不懂没关系,我们看最后的startActivity( ),它调用了startActivityUnchecked( )。这个方法里会根据启动标志位和Activity启动模式来决定如何启动一个Activity以及是否要调用deliverNewIntent方法通知Activity有一个Intent试图重新启动它

private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,
            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
            int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask,
            ActivityRecord[] outActivity) {
    ......
        computeLaunchingTaskFlags();  //处理Activity的启动模式,确定Activity的启动模式

        computeSourceStack();   //根据Activity启动模式来设置栈
            if (mStartActivity.getTask() == null && !clearTopAndResetStandardLaunchMode) 			{
                mStartActivity.setTask(reusedActivity.getTask());
            }

            if (reusedActivity.getTask().intent == null) {
                // This task was started because of movement of the activity based on affinity...
                // Now that we are actually launching it, we can assign the base intent.
                reusedActivity.getTask().setIntent(mStartActivity);
            }
       ......
         reusedActivity = setTargetStackAndMoveToFrontIfNeeded(reusedActivity);
......
         mTargetStack.startActivityLocked(mStartActivity, topFocused, newTask, mKeepCurTransition,mOptions);     //根据Activity的启动模式来判断是直接插入已存在的栈顶还是新开栈插入
......
                mSupervisor.resumeFocusedStackTopActivityLocked(mTargetStack, mStartActivity,mOptions);          //注释1
            }
        } 

computeLaunchingTaskFlags()

private void computeLaunchingTaskFlags() {
        ...

        if (mInTask == null) { //mInTask为TaskRecord类型,为null代表要加入的栈不存在,需要新建
            if (mSourceRecord == null) { //mSourceRecord为ActivityRecord类型
                
                if ((mLaunchFlags & FLAG_ACTIVITY_NEW_TASK) == 0 && mInTask == null) {
                    Slog.w(TAG, "startActivity called from non-Activity context; forcing " +
                            "Intent.FLAG_ACTIVITY_NEW_TASK for: " + mIntent);
                    mLaunchFlags |= FLAG_ACTIVITY_NEW_TASK;
                }
            } else if (mSourceRecord.launchMode == LAUNCH_SINGLE_INSTANCE) { //如果启动模式为SingleInstance,添加FLAG_ACTIVITY_NEW_TASK标志
                
                mLaunchFlags |= FLAG_ACTIVITY_NEW_TASK;
            } else if (isLaunchModeOneOf(LAUNCH_SINGLE_INSTANCE, LAUNCH_SINGLE_TASK)) { //如果启动模式为SingleInstance,SingleTask,也添加FLAG_ACTIVITY_NEW_TASK标志
                mLaunchFlags |= FLAG_ACTIVITY_NEW_TASK;
            }
        }
    }

注释1 ActivityStack的resumeFocusedStackTopActivityLocked( )

boolean resumeFocusedStackTopActivityLocked(
            ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {

        if (!readyToResume()) {
            return false;
        }

        if (targetStack != null && isFocusedStack(targetStack)) {
            //注释1
            return targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
        }

        final ActivityRecord r = mFocusedStack.topRunningActivityLocked();
        if (r == null || !r.isState(RESUMED)) {
            mFocusedStack.resumeTopActivityUncheckedLocked(null, null);
        } else if (r.isState(RESUMED)) {
            // Kick off any lingering app transitions form the MoveTaskToFront operation.
            mFocusedStack.executeAppTransition(targetOptions);
        }

        return false;
    }

注释1 resumeTopActivityUncheckedLocked( )

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

        boolean result = false;
        try {
            // Protect against recursion.
            mStackSupervisor.inResumeTopActivity = true;
            result = resumeTopActivityInnerLocked(prev, options);//注释1
            final ActivityRecord next = topRunningActivityLocked(true /* focusableOnly */);
            if (next == null || !next.canTurnScreenOn()) {
                checkReadyForSleep();
            }
        } finally {
            mStackSupervisor.inResumeTopActivity = false;
        }

        return result;
    }

resumeTopActivityInnerLocked( )

private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {
	...
       mStackSupervisor.startSpecificActivityLocked(next, true, false);
	...
}

回到ActivityStackSupervisor的startSpecificActivityLocked( )

void startSpecificActivityLocked(ActivityRecord r,
            boolean andResume, boolean checkConfig) {
    ....
    //进程存在则启动
    if (app != null && app.thread != null) {
        realStartActivityLocked(r, app, andResume, checkConfig);
        return;
    }

    //进程不存在则创建
    mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
            "activity", r.intent.getComponent(), false, false, true);
}

realStartActivityLocked()

final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,
            boolean andResume, boolean checkConfig) throws RemoteException {
    ......
    // Create activity launch transaction.
    //创建活动启动事务。
    final ClientTransaction clientTransaction = ClientTransaction.obtain(app.thread,
            r.appToken);
    //构建LaunchActivityItem对象,并传入clientTransaction中,用作callback
    clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),
            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, mService.isNextTransitionForward(),
            profilerInfo));

    // Schedule transaction.
    //执行事务  这里getLifecycleManager获取的是ClientLifecycleManager
    mService.getLifecycleManager().scheduleTransaction(clientTransaction);
    ......
}

Android9.0中,通过事务启动Activity,引入了ClientLifecycleManager和ClientTransactionHandler来辅助管理Activity生命周期,具体代码:

//ClientLifecycleManager#scheduleTransaction
void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
   
    transaction.schedule();
}

其中transaction实际上是创建ClientTransaction时传入的app.thread对象,也就是ApplicationThread,obtain()如下。

public static ClientTransaction obtain(IApplicationThread client, IBinder activityToken) {
        ClientTransaction instance = ObjectPool.obtain(ClientTransaction.class);
        if (instance == null) {
            instance = new ClientTransaction();
        }
        instance.mClient = client;
        instance.mActivityToken = activityToken;

        return instance;
    }
ApplicationThread --> Activity

ClientTransaction.schedule


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

mClient是一个IApplicationThread对象

@Override
public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
            ActivityThread.this.scheduleTransaction(transaction);
}

ActivityThread.scheduleTransaction 由其父类ClientTransactionHandler实现

public abstract class ClientTransactionHandler {

    // Schedule phase related logic and handlers.

    /** Prepare and schedule transaction for execution. */
    void scheduleTransaction(ClientTransaction transaction) {
        transaction.preExecute(this);
        sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
    }
    ...
}        

向handler发送消息,其中obj是启动Activity的transaction。Handler的具体实现是ActicityThread中的mH:

public final class ActivityThread extends ClientTransactionHandler {   
	...
    final H mH = new H();

	class H extends Handler {
    	...
        public void handleMessage(Message msg) {
            if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));
            switch (msg.what) {
                    case EXECUTE_TRANSACTION:
                    final ClientTransaction transaction = (ClientTransaction) msg.obj;
                    mTransactionExecutor.execute(transaction);
                    ...
                    break;
                    ...
            }    
    }

}

最终调用TransactionExecutor.execute()

public void execute(ClientTransaction transaction) {
        final IBinder token = transaction.getActivityToken();

        executeCallbacks(transaction);

        executeLifecycleState(transaction);
        mPendingActions.clear();
        log("End resolving transaction");
    }

executeCallbacks( )

 public void executeCallbacks(ClientTransaction transaction) {
        final List<ClientTransactionItem> callbacks = transaction.getCallbacks();
        ...
            
        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 (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);
            }
        }
    }

遍历事物中callback,并执行execute(),而这些callback实际上是LaunchActivityItem类型

clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),
            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, mService.isNextTransitionForward(),
            profilerInfo));

LaunchActivityItem.execute( )

@Override
public void execute(ClientTransactionHandler client, IBinder token,
            PendingTransactionActions pendingActions) {
        Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
        ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo,
                mOverrideConfig, mCompatInfo, mReferrer, mVoiceInteractor, mState, mPersistentState,
                mPendingResults, mPendingNewIntents, mIsForward,
                mProfilerInfo, client);
        client.handleLaunchActivity(r, pendingActions, null /* customIntent */);
        Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
    }

client是ClientTransactionHandler,其最终实现类为ActivityThread,所以最终还是回到ActivityThread中

ActivityThread.handleLaunchActivity( )

 @Override
    public Activity handleLaunchActivity(ActivityClientRecord r,
            PendingTransactionActions pendingActions, Intent customIntent) {
        // If we are getting ready to gc after going to the background, well
        // we are back active so skip it.
        ...
        WindowManagerGlobal.initialize();//初始化Activity的WindowManager

        final Activity a = performLaunchActivity(r, customIntent);//创建并显示Activity

        ...
    }

performLaunchActivity( )

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {

    ...
        Activity activity = null;
        try {
            //通过反射创建目标Activity对象
            java.lang.ClassLoader cl = appContext.getClassLoader();
            activity = mInstrumentation.newActivity(
                    cl, component.getClassName(), r.intent);
            StrictMode.incrementExpectedActivityCount(activity.getClass());
           
            r.intent.setExtrasClassLoader(cl);
            r.intent.prepareToEnterProcess();
            if (r.state != null) {
                r.state.setClassLoader(cl);
            }
        } catch (Exception e) {
            ...
        }

        
   ...
       			//建立activity与Context之间的联系创建PhoneWindow对象
                activity.attach(appContext, this, getInstrumentation(), r.token,
                        r.ident, app, r.intent, r.activityInfo, title, r.parent,
                        r.embeddedID, r.lastNonConfigurationInstances, config,
                        r.referrer, r.voiceInteractor, window, r.configCallback);

                ...
                if (r.isPersistable()) {
                    //最终调用Activity的onCreate()
                    mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
                } else {
                    mInstrumentation.callActivityOnCreate(activity, r.state);
                }
               
    ...
    }

完成启动目标Activity的全过程。

总结

Activity的启动涉及到多个进程间的通信:

  1. 首先由ActivityA所在的进程通过AIDL调用AMS的startActivity( )方法
  2. AMS计算、解析intent,然后再ActivityStack与ActivityStackSupervisor中处理Activity和Task的入栈操作。
  3. AMS通过AIDL调用ApplicationThread中的方法通知目标Activity所在的进程创建Activity并执行生命周期函数。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值