Android Activity起動プロセスソース解析


Android Launcher起動アプリケーションフローソース解析では、アプリケーションアイコンstartActivity()をクリックすることから、ApplicationMainActivityに説明されているonCreate()の方法が呼び出されます.中間の流れにはいくつかの高エネルギーがあり、高エネルギー部分は2編の博文が共有している場所で、迂回することはできません.本明細書では、Activity#onCreate()からActivity#onResume()までの流れについて主に説明する.遡及したい学生は、Android Launcherがアプリケーションプロセスのソースコード解析を開始した後、このブログを振り返ることをお勧めします.くどくど言わないで
明示的に起動しても暗黙的に起動してもActivityに入ります.
ソースの場所:frameworks/base/core/java/android/app/ActivityThread.java ActivityThread#handleLaunchActivity()
    private final void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {  
        ......  
        //   activity,    onCreate,onStart  
        Activity a = performLaunchActivity(r, customIntent);  
        if (a != null) {
            //   onResume  
            handleResumeActivity(r.token, false, r.isForward, !r.activity.mFinished && !r.startsNotResumed);
            ...   
        }
        ... 
    }  

注釈はちょっとドラマチックで、今日のポイントはすべてこの方法の中にあります.まずActivityThread#handleLaunchActivity()を見てみましょう
ActivityThread#performLaunchActivity()
    private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
    ...
            Activity activity = null;
        try {
            java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
            activity = mInstrumentation.newActivity(
                    cl, component.getClassName(), r.intent);
            ...
            }
            ...
        try {
            Application app = r.packageInfo.makeApplication(false, mInstrumentation);
            if (activity != null) {
                ...
                activity.attach(...)
                ...
                if (r.isPersistable()) {
                   mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
                } else {
                   mInstrumentation.callActivityOnCreate(activity, r.state);
                }
                ...
                if (!r.activity.mFinished) {
                    activity.performStart();
                    r.stopped = false;
                }
                ...
        return activity;
    }
performLaunchActivity()行のコードの役割はmInstrumentation.callActivityOnCreateを呼び出すことであり、Android Launcherでアプリケーションプロセスを開始するソースコード解析が紹介されているので、ここでは省略します.Activity#onCreate()を直接見ると、この方法の名前はとても魅力的ですね~フォローします.
ソースの場所:frameworks/base/core/java/android/app/Activity.java Activity#performStart()
    final void performStart() {
        mActivityTransitionState.setEnterActivityOptions(this, getActivityOptions());
        mFragments.noteStateNotSaved();
        mCalled = false;
        mFragments.execPendingActions();
        mInstrumentation.callActivityOnStart(this);
        if (!mCalled) {
            throw new SuperNotCalledException(
                "Activity " + mComponent.toShortString() +
                " did not call through to super.onStart()");
        }
        mFragments.dispatchStart();
        mFragments.reportLoaderStart();
        mActivityTransitionState.enterReady(this);
    }

真相はすでに叫び出した~、フォロー.
ソースの場所:frameworks/base/core/java/android/app/Instrumentation.java Instrumentation#callActivityOnStart()
    public void callActivityOnStart(Activity activity) {
        activity.onStart();
    }

ははは~また一つの方法を見つけたactivity.performStart().本当に簡単ですね~今Activity#onStart()の中のActivityThread#performLaunchActivity()に戻って、フォローします.
ソースの場所:frameworks/base/core/java/android/app/ActivityThread.java ActivityThread#handleResumeActivity() ActivityThread#ActivityClientRecord()
   final void handleResumeActivity(IBinder token,
            boolean clearHide, boolean isForward, boolean reallyResume) {
        ...
        ActivityClientRecord r = performResumeActivity(token, clearHide);
        ...
    }

    public final ActivityClientRecord performResumeActivity(IBinder token,
            boolean clearHide) {
        ...
        r.activity.performResume();
        ...
    }

中にはいろいろな状態が効いていて、何も言えませんでした.直接フォローする.
ソースの場所:frameworks/base/core/java/android/app/Activity.java Activity#performResume()
    final void performResume() {
        performRestart();
        ...
        mInstrumentation.callActivityOnResume(this);
        ...
    }

ここには2つの分岐がある.handleResumeActivity(r.token, false, r.isForward, !r.activity.mFinished && !r.startsNotResumed)を実行する前に、onResume()およびonRestart()を実行する必要がある.例えば、前のonStart()から戻ってきたときは、ここがポイントではありませんが、少し見ています.2.直接実行Activityブランチ1:Activity#performRestart()
    final void performRestart() {
        ...
        mInstrumentation.callActivityOnRestart(this);
        performStart();
    }

この2つの方法は上述したように分析されたので,これ以上述べない.
ブランチ2:ソースコード位置:frameworks/base/core/java/android/app/Instrumentation.java Instrumentation#callActivityOnStart()
    public void callActivityOnResume(Activity activity) {
        activity.mResumed = true;
        activity.onResume();

        if (mActivityMonitors != null) {
            synchronized (mSync) {
                final int N = mActivityMonitors.size();
                for (int i=0; ifinal ActivityMonitor am = mActivityMonitors.get(i);
                    am.match(activity, activity, activity.getIntent());
                }
            }
        }
    }

ダイレクトコールonResume().
終わりました.このブログの終わりは前のどのブログよりも速く、理解しやすいです.このすべての前提は、私の元のブログAndroid Launcherを読んでアプリケーションプロセスのソースコード解析を開始することです.
その他のFrameworkソース解析は、Frameworkソース解析シリーズ[ディレクトリ]に移動してください.