Activityのプロセスの開始
4994 ワード
Android Qに基づいて、以前のバージョンの考え方も同じですが、一部違います. Activity.startActivity Activity.startActivityForResult Instrumentation.execStartActivity IActivityTaskManager.startActivity(aidlはbinderのプロセス間通信、通信を実現するクライアント、以上の部分はアプリケーションプロセス) ActivityTaskManagerService.startActivity(IActivityTaskManager.Stubを実現し、プロセス間通信のサービス側であり、この部分はシステムプロセスである) ActivityTaskManagerService.startActivityAsUser ActivityStarter.execute ActivityStarter.startActivityMayWait ActivityStarter.startActivity(このリロード方法はいくつかあります) ActivityStarter.startActivityUnchecked ActivityStack.ensureActivitiesVisibleLocked ActivityRecord.makeClientVisible ActivityRecord.makeActiveIfNeeded ActivityStack.resumeTopActivityUncheckedLocked ActivityStack.resumeTopActivityInnerLocked ActivityStackSupervisor.startSpecificActivityLocked ActivityStackSupervisor.realStartActivityLocked { mService.getLifecycleManager().scheduleTransaction(clientTransaction); } ClientLifecycleManager.scheduleTransaction ClientTransaction.schedule(ClientTransactionのmActivity CallbacksはLaunchActivity Item) IApplicationThread.scheduleTransaction(ここでもaidlを使用してbinderを介して通信するクライアントであり、この部分はシステムプロセスにある) ApplicationThread.scheduleTransaction(IApplicationThread.Stubを実現し、プロセス間通信のサービス側であり、この部分はアプリケーションプロセスである) ClientTransactionHandler.scheduleTransaction ActivityThread.sendMessage (what = EXECUTE_TRANSACTION) ActivityThread$H.handleMessage TransactionExecutor.execute TransactionExecutor.executeCallbacks ClientTransactionItem.Excute(ClientTransactionItemはLaunchActivity Item)*ClientTransactionHandler.handleLaunchActivity(ClientTransactionHandlerの実装はActivity Thread) ActivityThread.performLaunchActivity{Instrumentation.newActivity activity作成activityインスタンス->activity.attach->activity.mIntent=customIntent->activity.settTheme} Instrumentation.callActivityOnCreate Activity.performCreate Activity.onCreate
ここでactivityが起動します
全体的に、どのバージョンでも次のようになります.まずstartActivity Instrumentation呼び出しActivityManagerService(後述AMS)は、プロセス間通信を介してアプリケーションプロセスからシステムプロセスに呼び出し、システムプロセスでいくつかのカラム操作 を行う.システムプロセス処理が完了すると、IApplicationThreadによってもインタープロセス通信が行われ、システムプロセスからアプリケーションプロセスに戻る、Activity ThreadのHandlerによってメッセージ が処理される.最後に、開始するActivityをInstrumentationで作成し、作成したactivityのonCreateメソッド を呼び出します.
つまりActivityを起動するのは、実は2回のプロセス間通信を経てActivityを起動したのです.
その他のライフサイクルの呼び出し
onResumeとonPause
別のactivityを起動すると、現在のactivityのonPauseメソッドを呼び出してから起動したActivityのonResumeメソッドを呼び出すことが以前からわかっていたが、この理由は起動プロセスを上で分析することで見つけることができ、Activity Stack.resumeTopActivity InnerLockedメソッドでは、前のActivityのonPauseを実行してから現在のactivityのonResumeメソッドを実行することがわかります.
onResumeとonPauseの実行はいずれもonCreateと同様に継承されたClientTransactionItemによって最終的にTransactionExecutorによって行われることがわかる.executeCallbacks時に対応するitemを呼び出す.executeメソッドは、Activity Threadの対応メソッドを呼び出し、InstrumentationでActivityと対話します.
onStartとonStop呼び出しの場所はまた少し違います.
onStartはonResumeメソッドでTransactionExecutorを実行する.executeメソッドでexecuteLifecycleStateメソッドで呼び出されたもの.次にcycleToPath->performLifecycleSequence->Activity Threadを呼び出します.handleStartActivityは、その後もInstrumentationでActivityを実行する.onStartメソッド
onStopはActivity Threadを呼び出しています.handleResumeActivityメソッドの最後にアイドルHandlerによってidlerが呼び出され、AMSのactivityIdleメソッドがループされ、Activity StackSupervisorのactivityIdleInternalLockedメソッドが呼び出され、processsStopppingActivitiesLockedメソッドによってstopが必要なActivity情報が得られる.これらstopのactivityでfinishが必要でない場合は、Activity StackのstopActivity Lockedメソッドを実行し、他の以前と同様に使用します.
このようにActivityで対応するメソッドを実行し、最後にInstrumentationでActivityを実行する.onStopメソッド.
ここでactivityが起動します
全体的に、どのバージョンでも次のようになります.
つまりActivityを起動するのは、実は2回のプロセス間通信を経てActivityを起動したのです.
その他のライフサイクルの呼び出し
onResumeとonPause
別のactivityを起動すると、現在のactivityのonPauseメソッドを呼び出してから起動したActivityのonResumeメソッドを呼び出すことが以前からわかっていたが、この理由は起動プロセスを上で分析することで見つけることができ、Activity Stack.resumeTopActivity InnerLockedメソッドでは、前のActivityのonPauseを実行してから現在のactivityのonResumeメソッドを実行することがわかります.
//2744
boolean pausing = getDisplay().pauseBackStacks(userLeaving, next, false);
if (mResumedActivity != null) {
if (DEBUG_STATES) Slog.d(TAG_STATES,
"resumeTopActivityLocked: Pausing " + mResumedActivity);
pausing |= startPausingLocked(userLeaving, false, next, false);
}
//2983
transaction.setLifecycleStateRequest(
ResumeActivityItem.obtain(next.app.getReportedProcState(),
getDisplay().mDisplayContent.isNextTransitionForward()));
mService.getLifecycleManager().scheduleTransaction(transaction);
final boolean startPausingLocked(boolean userLeaving, boolean uiSleeping,
ActivityRecord resuming, boolean pauseImmediately) {
// ...
mService.getLifecycleManager().scheduleTransaction(prev.app.getThread(),
prev.appToken, PauseActivityItem.obtain(prev.finishing, userLeaving,
prev.configChangeFlags, pauseImmediately));
// ...
}
onResumeとonPauseの実行はいずれもonCreateと同様に継承されたClientTransactionItemによって最終的にTransactionExecutorによって行われることがわかる.executeCallbacks時に対応するitemを呼び出す.executeメソッドは、Activity Threadの対応メソッドを呼び出し、InstrumentationでActivityと対話します.
onStartとonStop呼び出しの場所はまた少し違います.
onStartはonResumeメソッドでTransactionExecutorを実行する.executeメソッドでexecuteLifecycleStateメソッドで呼び出されたもの.次にcycleToPath->performLifecycleSequence->Activity Threadを呼び出します.handleStartActivityは、その後もInstrumentationでActivityを実行する.onStartメソッド
onStopはActivity Threadを呼び出しています.handleResumeActivityメソッドの最後にアイドルHandlerによってidlerが呼び出され、AMSのactivityIdleメソッドがループされ、Activity StackSupervisorのactivityIdleInternalLockedメソッドが呼び出され、processsStopppingActivitiesLockedメソッドによってstopが必要なActivity情報が得られる.これらstopのactivityでfinishが必要でない場合は、Activity StackのstopActivity Lockedメソッドを実行し、他の以前と同様に使用します.
mService.getLifecycleManager().scheduleTransaction(r.app.getThread(), r.appToken,
StopActivityItem.obtain(r.visible, r.configChangeFlags));
このようにActivityで対応するメソッドを実行し、最後にInstrumentationでActivityを実行する.onStopメソッド.