Android13 ActivityThread handleStartActivity流程分析

ActivityThread的handleStartActivity方法用于处理ActivityStart请求,代码如下:

//frameworks/base/core/java/android/app/ActivityThread.java
public final class ActivityThread extends ClientTransactionHandler implements ActivityThreadInternal {
    Instrumentation mInstrumentation;
    public void handleStartActivity(ActivityClientRecord r,
            PendingTransactionActions pendingActions, ActivityOptions activityOptions) {
        final Activity activity = r.activity;
        if (!r.stopped) {
            throw new IllegalStateException("Can't start activity that is not stopped.");
        }
        if (r.activity.mFinished) {
            // TODO(lifecycler): How can this happen?
            return;
        }


        unscheduleGcIdler();
        if (activityOptions != null) {
            activity.mPendingOptions = activityOptions;
        }


        // Start
        activity.performStart("handleStartActivity");
        r.setState(ON_START);


        if (pendingActions == null) {
            // No more work to do.
            return;
        }


        // Restore instance state
        if (pendingActions.shouldRestoreInstanceState()) {
            if (r.isPersistable()) {
                if (r.state != null || r.persistentState != null) {
                    mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state,
                            r.persistentState);
                }
            } else if (r.state != null) {
                mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state);
            }
        }


        // Call postOnCreate()
        if (pendingActions.shouldCallOnPostCreate()) {
            activity.mCalled = false;
            if (r.isPersistable()) {
                mInstrumentation.callActivityOnPostCreate(activity, r.state,
                        r.persistentState);
            } else {
                mInstrumentation.callActivityOnPostCreate(activity, r.state);
            }
            if (!activity.mCalled) {
                throw new SuperNotCalledException(
                        "Activity " + r.intent.getComponent().toShortString()
                                + " did not call through to super.onPostCreate()");
            }
        }


        updateVisibility(r, true /* show */);
        mSomeActivitiesChanged = true;
    }
}

上面方法主要处理如下:

1、调用activity的performStart方法。

2、调用Instrumentation的callActivityOnRestoreInstanceState方法。

3、调用Instrumentation的callActivityOnPostCreate方法。

下面分别进行分析:

Activity performStart

调用activity的performStart方法:

Android13 Activity performStart流程分析-CSDN博客

Instrumentation callActivityOnRestoreInstanceState

调用Instrumentation的callActivityOnRestoreInstanceState方法,Instrumentation的callActivityOnRestoreInstanceState方法用于调用还原实例状态时的活动。

//frameworks/base/core/java/android/app/Instrumentation.java
public class Instrumentation {
    public void callActivityOnRestoreInstanceState(@NonNull Activity activity,
            @NonNull Bundle savedInstanceState) {
        activity.performRestoreInstanceState(savedInstanceState);
    }
}

Activity performRestoreInstanceState

调用Activity的performRestoreInstanceState方法:

//frameworks/base/core/java/android/app/Activity.java
public class Activity extends ContextThemeWrapper
        implements LayoutInflater.Factory2,
        Window.Callback, KeyEvent.Callback,
        OnCreateContextMenuListener, ComponentCallbacks2,
        Window.OnWindowDismissedCallback,
        ContentCaptureManager.ContentCaptureClient {
    final void performRestoreInstanceState(@NonNull Bundle savedInstanceState) {
        onRestoreInstanceState(savedInstanceState);
        restoreManagedDialogs(savedInstanceState);
    }
}

调用Activity的onRestoreInstanceState方法:

//frameworks/base/core/java/android/app/Activity.java
public class Activity extends ContextThemeWrapper
        implements LayoutInflater.Factory2,
        Window.Callback, KeyEvent.Callback,
        OnCreateContextMenuListener, ComponentCallbacks2,
        Window.OnWindowDismissedCallback,
        ContentCaptureManager.ContentCaptureClient {
    final void performRestoreInstanceState(@NonNull Bundle savedInstanceState) {
    protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
        if (mWindow != null) {
            Bundle windowState = savedInstanceState.getBundle(WINDOW_HIERARCHY_TAG);
            if (windowState != null) {
                mWindow.restoreHierarchyState(windowState);
            }
        }
    }
}

Instrumentation callActivityOnPostCreate

调用Instrumentation的callActivityOnPostCreate方法,Instrumentation的callActivityOnPostCreate方法用于调用Activity的OnCreate方法。

//frameworks/base/core/java/android/app/Instrumentation.java
public class Instrumentation {
    public void callActivityOnPostCreate(@NonNull Activity activity,
            @Nullable Bundle savedInstanceState) {
        activity.onPostCreate(savedInstanceState);
    }
}

Activity onPostCreate

调用Activity的onPostCreate方法:

void onPostCreate(@Nullable Bundle savedInstanceState):Activity的界面布局完成后,进行一些进一步初始化操作对UI控件进行调整,该方法在Activity的onCreate()方法执行完毕后调用。

在其子类(应用程序实现)的onPostCreate会调用super.onPostCreate(savedInstanceState)方法:

//frameworks/base/core/java/android/app/Activity.java
public class Activity extends ContextThemeWrapper
        implements LayoutInflater.Factory2,
        Window.Callback, KeyEvent.Callback,
        OnCreateContextMenuListener, ComponentCallbacks2,
        Window.OnWindowDismissedCallback,
        ContentCaptureManager.ContentCaptureClient {
    protected void onPostCreate(@Nullable Bundle savedInstanceState) {
        if (!isChild()) {
            mTitleReady = true;
            onTitleChanged(getTitle(), getTitleColor());
        }


        mCalled = true;


        notifyContentCaptureManagerIfNeeded(CONTENT_CAPTURE_START);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值