Android Activity——启动过程探索

Posted ITRenj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Activity——启动过程探索相关的知识,希望对你有一定的参考价值。

《Android Activity——启动过程探索(一)》中我们知道了Activity启动的生命周期回调,并且分析了其中当前Activity的 onPause() 和新打开的Activity的 onCreate() 回调方法执行步骤,在这篇文章中接着分析新打开的Activity的 onStart()onResume()回调执行过程。

注意:以下分析过程,源码版本为 android 10(Api 29),不同Android版本可能有一些差别。

新的Activity调用 onStart()

根据上图查看对应的方法:

当我们调用 startActivity() 之后,系统按如下步骤执行:

-> Activity#startActivity()
-> Activity#startActivityForResult()
-> Instrumentation#execStartActivity(activity, mMainThread.getApplicationThread(), mToken, this,intent, requestCode, options)

说明:

  1. mMainThread.getApplicationThread() 返回 ApplicationThread
  2. ApplicationThread 的声明为 ActivityThread.ApplicationThread extends IApplicationThread.Stub

-> ActivityTaskManagerService#startActivity()

说明:

  1. ActivityTaskManagerService 通过 ActivityTaskManager.getService() 获取
  2. ActivityTaskManager.getService() 返回 IActivityTaskManager
  3. ActivityTaskManagerService 的声明为 ActivityTaskManagerService extends IActivityTaskManager.Stub,所以上一步是: ActivityTaskManagerService#startActivity()

-> ActivityTaskManagerService#startActivityAsUser()

说明:

  1. 会多次调用重载方法,这里就看做一步了,最终走到 下一步

-> ActivityStartController#obtainStarter()

说明:

  1. ActivityStartController 通过 getActivityStartController() 方法获取
  2. ActivityStartController.obtainStarter() 方法返回的是ActivityStarter对象
  3. 然后设置数据,实际调用的都是 ActivityStarter 中的设置数据方法,最终调用 ActivityStarter 的 execute() 方法

具体代码如下:

	getActivityStartController().obtainStarter(intent, "startActivityAsUser")
                .setCaller(caller)
                .setCallingPackage(callingPackage)
                .setResolvedType(resolvedType)
                .setResultTo(resultTo)
                .setResultWho(resultWho)
                .setRequestCode(requestCode)
                .setStartFlags(startFlags)
                .setProfilerInfo(profilerInfo)
                .setActivityOptions(bOptions)
                .setMayWait(userId) // 注意该方法,会将ActivityStarter mRequest.mayWait = true;
                .execute();

-> ActivityStarter#execute()

说明:

  1. 上一步的 setMayWait() 方法 会将 ActivityStarter 中的 mRequest.mayWait 标识置为 true,在 execute() 方法中会通过该标记判断下一步执行的方法

-> ActivityStarter#startActivityMayWait()
-> ActivityStarter#startActivity()

说明:

  1. 会多次调用重载 startActivity() 方法,这里就看做一步了,最终走到 下一步

-> ActivityStarter#startActivityUnchecked()
-> RootActivityContainer#resumeFocusedStacksTopActivities()

说明:

  1. 调用重载无参数方法,由无参数方法调用有参数方法,参数都为null,看做一步,走到下一步

-> ActivityStack#resumeTopActivityUncheckedLocked()
-> ActivityStack#resumeTopActivityInnerLocked()
-> ActivityStackSupervisor#startSpecificActivityLocked()
-> ActivityStackSupervisor#realStartActivityLocked()

realStartActivityLocked() 方法中有如下代码:

// Create activity launch transaction.
final ClientTransaction clientTransaction = ClientTransaction.obtain(
        proc.getThread(), r.appToken);

final DisplayContent dc = r.getDisplay().mDisplayContent;
clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),
        System.identityHashCode(r), r.info,
        mergedConfiguration.getGlobalConfiguration(),
        mergedConfiguration.getOverrideConfiguration(), r.compat,
        r.launchedFromPackage, task.voiceInteractor, proc.getReportedProcState(),
        r.icicle, r.persistentState, results, newIntents,
        dc.isNextTransitionForward(), proc.createProfilerInfoIfNeeded(),r.assistToken));

mService.getLifecycleManager().scheduleTransaction(clientTransaction);

说明:

  1. mService.getLifecycleManager() 方法返回的对象是 ClientLifecycleManager,(其中mService 是 ActivityTaskManagerService)
  2. 创建 ClientTransaction 对象后,调用了它的 addCallback() 方法,增加了 LaunchActivityItem 对象(LaunchActivityItem extends ClientTransactionItem)

-> ClientLifecycleManager#scheduleTransaction(ClientTransaction transaction)
-> ClientTransaction#schedule()
-> IApplicationThread#scheduleTransaction()

说明:

  1. IApplicationThread就是ActivityThread.ApplicationThread
  2. 在 ActivityThread.ApplicationThread 中直接调用了 ActivityThread.this.scheduleTransaction(transaction),所以最终调用的是 ActivityThread#scheduleTransaction(),但是 ActivityThread 中并没有这个方法,是在其父类 ClientTransactionHandler 中的方法( ActivityThread extends ClientTransactionHandler)

-> ClientTransactionHandler#sendMessage()

说明:

  1. sendMessage() 方法在 ClientTransactionHandler中定义,由子类 ActivityThread 实现

  2. 在sendMessage()方法中传递的 what 是 ActivityThread.H.EXECUTE_TRANSACTION

  3. 在ActivityThread中的handler消息都是由 ActivityThread 内部类 H 负责处理,所以查看 H 类中 handleMessage() 方法对应的处理逻辑

     case EXECUTE_TRANSACTION:
         final ClientTransaction transaction = (ClientTransaction) msg.obj;
         mTransactionExecutor.execute(transaction);
         if (isSystem()) 
             transaction.recycle();
         
         break;
    
  4. mTransactionExecutor 对象是 TransactionExecutor

-> TransactionExecutor#execute(transaction)

==== 标记 =============================== 以上部分和上一步的是一样的 ==================================== 标记 ====

-> TransactionExecutor#executeCallbacks(transaction)
-> TransactionExecutor#cycleToPath(ActivityClientRecord r, int finish, boolean excludeLastState,ClientTransaction transaction)

说明:

  1. 直接是调用的4个参数的方法,且第三个参数传递的是 true

  2. 核心代码

    final IntArray path = mHelper.getLifecyclePath(start, finish, excludeLastState);
    performLifecycleSequence(r, path, transaction);

getLifecyclePath() 方法参数说明:
1. start:在上一步(调用新的Activity的onCreate()方法)中的performLaunchActivity()方法中ActivityClientRecord的状态已经变为了ON_CREATE(值为:1)
2. finish:在 ActivityStackSupervisor#realStartActivityLocked()方法中有如下代码:

		if (andResume) 
            lifecycleItem = ResumeActivityItem.obtain(dc.isNextTransitionForward());
         else 
            lifecycleItem = PauseActivityItem.obtain();
        
		clientTransaction.setLifecycleStateRequest(lifecycleItem);

往前走能知道 andResume 参数为 true,所以这里的 lifecycleItem 为 ResumeActivityItem,参数 finish 通过 lifecycleItem.getTargetState() 获取(lifecycleItem  为 ResumeActivityItem)到的结果为 ON_RESUME (值为:3)
  1. mHelper.getLifecyclePath() 实际是 TransactionExecutorHelper#getLifecyclePath(),代码如下:

     	public IntArray getLifecyclePath(int start, int finish, boolean excludeLastState) 
             // ...
             mLifecycleSequence.clear();
             if (finish >= start) 
                 // just go there
                 for (int i = start + 1; i <= finish; i++) 
                     mLifecycleSequence.add(i);
                 
             
     		// ...
     		// 这里的参数 excludeLastState 就是上面调用 cycleToPath() 方法的第三个参数,是true 
     		if (excludeLastState && mLifecycleSequence.size() != 0) 
                 mLifecycleSequence.remove(mLifecycleSequence.size() - 1);
             
     		return mLifecycleSequence;
     	
    

那么结果就是一个包含了元素 2 的数组。

-> TransactionExecutor#performLifecycleSequence(ActivityClientRecord r, IntArray path,ClientTransaction transaction)

说明:

private void performLifecycleSequence(ActivityClientRecord r, IntArray path,ClientTransaction transaction) 
	// path 数组的元素只包含了 2 也就是对应 ON_START 常量,所以这里只保留了相关代码      
	final int size = path.size();
    for (int i = 0, state; i < size; i++) 
        state = path.get(i);
        switch (state) 
            case ON_START:
                mTransactionHandler.handleStartActivity(r, mPendingActions);
                break;
        
    

-> ClientTransactionHandler#handleStartActivity()

说明:

  1. handleStartActivity() 方法在 ClientTransactionHandler中定义,由子类 ActivityThread 实现,所以查看 ActivityThread 的 handleStartActivity()

-> Activity#performStart()
-> Instrumentation#callActivityOnStart()
-> Activity#onStart()

通过以上过程,最终调用了新的Activity 的 onStart() 回调方法。接下来,继续查看新的Activity 的 onResume() 回调执行过程。

新的Activity调用 onResume()

根据上图查看对应的方法:

当我们调用 startActivity() 之后,系统按如下步骤执行:

-> Activity#startActivity()
-> Activity#startActivityForResult()
-> Instrumentation#execStartActivity(activity, mMainThread.getApplicationThread(), mToken, this,intent, requestCode, options)

说明:

  1. mMainThread.getApplicationThread() 返回 ApplicationThread
  2. ApplicationThread 的声明为 ActivityThread.ApplicationThread extends IApplicationThread.Stub

-> ActivityTaskManagerService#startActivity()

说明:

  1. ActivityTaskManagerService 通过 ActivityTaskManager.getService() 获取
  2. ActivityTaskManager.getService() 返回 IActivityTaskManager
  3. ActivityTaskManagerService 的声明为 ActivityTaskManagerService extends IActivityTaskManager.Stub,所以上一步是: ActivityTaskManagerService#startActivity()

-> ActivityTaskManagerService#startActivityAsUser()

说明:

  1. 会多次调用重载方法,这里就看做一步了,最终走到 下一步

-> ActivityStartController#obtainStarter()

说明:

  1. ActivityStartController 通过 getActivityStartController() 方法获取
  2. ActivityStartController.obtainStarter() 方法返回的是ActivityStarter对象
  3. 然后设置数据,实际调用的都是 ActivityStarter 中的设置数据方法,最终调用 ActivityStarter 的 execute() 方法

具体代码如下:

	getActivityStartController().obtainStarter(intent, "startActivityAsUser")
                .setCaller(caller)
                .setCallingPackage(callingPackage)
                .setResolvedType(resolvedType)
                .setResultTo(resultTo)
                .setResultWho(resultWho)
                .setRequestCode(requestCode)
                .setStartFlags(startFlags)
                .setProfilerInfo(profilerInfo)
                .setActivityOptions(bOptions)
                .setMayWait(userId) // 注意该方法,会将ActivityStarter mRequest.mayWait = true;
                .execute();

-> ActivityStarter#execute()

说明:

  1. 上一步的 setMayWait() 方法 会将 ActivityStarter 中的 mRequest.mayWait 标识置为 true,在 execute() 方法中会通过该标记判断下一步执行的方法

-> ActivityStarter#startActivityMayWait()
-> ActivityStarter#startActivity()

说明:

  1. 会多次调用重载 startActivity() 方法,这里就看做一步了,最终走到 下一步

-> ActivityStarter#startActivityUnchecked()
-> RootActivityContainer#resumeFocusedStacksTopActivities()

说明:

  1. 调用重载无参数方法,由无参数方法调用有参数方法,参数都为null,看做一步,走到下一步

-> ActivityStack#resumeTopActivityUncheckedLocked()
-> ActivityStack#resumeTopActivityInnerLocked()
-> ActivityStackSupervisor#startSpecificActivityLocked()
-> ActivityStackSupervisor#realStartActivityLocked()

realStartActivityLocked() 方法中有如下代码:

// Create activity launch transaction.
final ClientTransaction clientTransaction = ClientTransaction.obtain(
        proc.getThread(), r.appToken);

final DisplayContent dc = r.getDisplay().mDisplayContent;
clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),
        System.identityHashCode(r), r.info,
        mergedConfiguration.getGlobalConfiguration(),
        mergedConfiguration.getOverrideConfiguration(), r.compat,
        r.launchedFromPackage, task.voiceInteractor, proc.getReportedProcState(),
        r.icicle, r.persistentState, results, newIntents,
        dc.isNextTransitionForward(), proc.createProfilerInfoIfNeeded(),r.assistToken));

mService.getLifecycleManager().scheduleTransaction(clientTransaction);

说明:

  1. mService.getLifecycleManager() 方法返回的对象是 ClientLifecycleManager,(其中mService 是 ActivityTaskManagerService)
  2. 创建 ClientTransaction 对象后,调用了它的 addCallback() 方法,增加了 LaunchActivityItem 对象(LaunchActivityItem extends ClientTransactionItem)

-> ClientLifecycleManager#scheduleTransaction(ClientTransaction transaction)
-> ClientTransaction#schedule()
-> IApplicationThread#scheduleTransaction()

说明:

  1. IApplicationThread就是ActivityThread.ApplicationThread
  2. 在 ActivityThread.ApplicationThread 中直接调用了 ActivityThread.this.scheduleTransaction(transaction),所以最终调用的是 ActivityThread#scheduleTransaction(),但是 ActivityThread 中并没有这个方法,是在其父类 ClientTransactionHandler 中的方法( ActivityThread extends ClientTransactionHandler)

-> ClientTransactionHandler#sendMessage()

说明:

  1. sendMessage() 方法在 ClientTransactionHandler中定义,由子类 ActivityThread 实现

  2. 在sendMessage()方法中传递的 what 是 ActivityThread.H.EXECUTE_TRANSACTION

  3. 在ActivityThread中的handler消息都是由 ActivityThread 内部类 H 负责处理,所以查看 H 类中 handleMessage() 方法对应的处理逻辑

     case EXECUTE_TRANSACTION:
         final ClientTransaction transaction = (ClientTransaction) msg.obj;
         mTransactionExecutor.execute(transaction);
         if (isSystem()) 
             transaction.recycle();
         
         break;
    
  4. mTransactionExecutor 对象是 TransactionExecutor

-> TransactionExecutor#execute(transaction)
-> TransactionExecutor#executeCallbacks(transaction)

==== 标记 =============================== 以上部分和上一步的是一样的 ==================================== 标记 ====

-> ActivityLifecycleItem#execute()

final ActivityLifecycleItem lifecycleItem = transaction.getLifecycleStateRequest();
lifecycleItem.execute(mTransactionHandler, token, mPendingActions);

说明:

  1. transaction.getLifecycleStateRequest() 获取到的实际是:ResumeActivityItem。具体原因如下:

    在 ActivityStackSupervisor#realStartActivityLocked()方法中有如下代码:

     		if (andResume) 
                 lifecycleItem = ResumeActivityItem.obtain(dc.isNextTransitionForward());
              else 
                 lifecycleItem = PauseActivityItem.obtain();
             
     		// 设置了 lifecycleItem 
     		clientTransaction.setLifecycleStateRequest(lifecycleItem);
    

    往前走能知道 andResume 参数为 true,所以这里的 lifecycleItem 为 ResumeActivityItem

-> ClientTransactionHandler#handleResumeActivity()

说明:

  1. handleResumeActivity() 方法在 ClientTransactionHandler中定义,由子类 ActivityThread 实现,所以查看 ActivityThread 的 handleResumeActivity()

-> ActivityThread#performResumeActivity()
-> Activity#performResume()
-> Instrumentation#callActivityOnResume()
-> Activity#onResume()

其他说明:

在 Activity#performResume() 方法中,如果当前打开的Activity是有 stop -> start 状态的话,因为之前不会走创建那一块的逻辑了,所以调用流程如下:

-> Activity#performResume()
-> Activity#performRestart()
-> Instrumentation#callActivityOnRestart()
-> Activity#onRestart()
-> Activity#callActivityOnRestart()
-> Instrumentation#callActivityOnStart()
-> Activity#onStart()
-> Instrumentation#callActivityOnResume()
-> Activity#onResume()

通过以上过程,最终调用了新的Activity 的 onResume() 回调方法。到这一步,新的Activity已经完成了 创建->用户可见->用户可操作的过程,启动过程中的新的Activity回调执行完成。

以上是关于Android Activity——启动过程探索的主要内容,如果未能解决你的问题,请参考以下文章

Android Activity——启动过程探索

Android Activity——启动过程探索

Android-AndroidManifest.xml默认启动的Activity(探索篇01)

Activity常见问题

Activity常见问题

Android 10 App启动分析之Activity启动篇