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メソッドを実行することがわかります.
    //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メソッド.