Activity的recreate方法用于重新创建当前Activity的实例。当系统配置发生变化(例如屏幕旋转、语言设置更改等)时,Activity会被销毁并重新创建。在这种情况下,系统会调用Activity的recreate方法来重新创建Activity的实例,以便保留当前的状态和数据。
//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 {
ActivityThread mMainThread;
public void recreate() {
if (mParent != null) {
throw new IllegalStateException("Can only be called on top-level activity");
}
if (Looper.myLooper() != mMainThread.getLooper()) {
throw new IllegalStateException("Must be called from main thread");
}
mMainThread.scheduleRelaunchActivity(mToken);
}
}
ActivityThread scheduleRelaunchActivity
调用mMainThread(ActivityThread)的scheduleRelaunchActivity方法:
//frameworks/base/core/java/android/app/ActivityThread.java
public final class ActivityThread extends ClientTransactionHandler implements ActivityThreadInternal {
void scheduleRelaunchActivity(IBinder token) {
final ActivityClientRecord r = mActivities.get(token);
if (r != null) {
Log.i(TAG, "Schedule relaunch activity: " + r.activityInfo.name);
scheduleRelaunchActivityIfPossible(r, !r.stopped /* preserveWindow */);
}
}
}
调用ActivityThread的scheduleRelaunchActivityIfPossible方法:
//frameworks/base/core/java/android/app/ActivityThread.java
public final class ActivityThread extends ClientTransactionHandler implements ActivityThreadInternal {
private void scheduleRelaunchActivityIfPossible(@NonNull ActivityClientRecord r,
boolean preserveWindow) {
if ((r.activity != null && r.activity.mFinished) || r.token instanceof Binder) {
// Do not schedule relaunch if the activity is finishing or is a local object (e.g.
// created by ActivtiyGroup that server side doesn't recognize it).
return;
}
if (preserveWindow && r.window != null) {
r.mPreserveWindow = true;
}
mH.removeMessages(H.RELAUNCH_ACTIVITY, r.token);
sendMessage(H.RELAUNCH_ACTIVITY, r.token);
}
}
发送