Android13 Activity recreate流程分析

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);
    }
}

发送RELAUNCH_ACTIVITY消息,发送的消息在H的handleMessage方法中处理:

//frameworks/base/core/java/android/app/ActivityThread.java
public final class ActivityThread extends ClientTransactionHandler implements ActivityThreadInternal {
    class H extends Handler {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case RELAUNCH_ACTIVITY:
                    handleRelaunchActivityLocally((IBinder) msg.obj);
                    break;
            }
        }
    }
}

调用ActivityThread的handleRelaunchActivityLocally方法:

//frameworks/base/core/java/android/app/ActivityThread.java
public final class ActivityThread extends ClientTransactionHandler implements ActivityThreadInternal {
    public void handleRelaunchActivityLocally(IBinder token) {
        final ActivityClientRecord r = mActivities.get(token);
        if (r == null) {
            Log.w(TAG, "Activity to relaunch no longer exists");
            return;
        }


        final int prevState = r.getLifecycleState();


        if (prevState < ON_START || prevState > ON_STOP) {
            Log.w(TAG, "Activity state must be in [ON_START..ON_STOP] in order to be relaunched,"
                    + "current state is " + prevState);
            return;
        }


        ActivityClient.getInstance().activityLocalRelaunch(r.token);
        // Initialize a relaunch request.
        final MergedConfiguration mergedConfiguration = new MergedConfiguration(
                r.createdConfig != null
                        ? r.createdConfig : mConfigurationController.getConfiguration(),
                r.overrideConfig);
        final ActivityRelaunchItem activityRelaunchItem = ActivityRelaunchItem.obtain(
                null /* pendingResults */, null /* pendingIntents */, 0 /* configChanges */,
                mergedConfiguration, r.mPreserveWindow);
        // Make sure to match the existing lifecycle state in the end of the transaction.
        final ActivityLifecycleItem lifecycleRequest =
                TransactionExecutorHelper.getLifecycleRequestForCurrentState(r);
        // Schedule the transaction.
        final ClientTransaction transaction = ClientTransaction.obtain(this.mAppThread, r.token);
        transaction.addCallback(activityRelaunchItem);
        transaction.setLifecycleStateRequest(lifecycleRequest);
        executeTransaction(transaction);
    }
}

ClientTransactionHandler executeTransaction

调用ClientTransactionHandler的executeTransaction方法:

//frameworks/base/core/java/android/app/ClientTransactionHandler.java
public abstract class ClientTransactionHandler {
    public void executeTransaction(ClientTransaction transaction) {
        transaction.preExecute(this);
        getTransactionExecutor().execute(transaction);
        transaction.recycle();
    }
    abstract TransactionExecutor getTransactionExecutor();
}

调用ClientTransactionHandler的getTransactionExecutor方法获取TransactionExecutor对象,ClientTransactionHandler的getTransactionExecutor方法是一个抽象方法,由其子类ActivityThread实现:

//frameworks/base/core/java/android/app/ActivityThread.java
public final class ActivityThread extends ClientTransactionHandler
        implements ActivityThreadInternal {
    TransactionExecutor getTransactionExecutor() {
        return mTransactionExecutor;
    }
}

然后调用mTransactionExecutor(TransactionExecutor)的execute方法:

//frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java
public class TransactionExecutor {
    public void execute(ClientTransaction transaction) {
        if (DEBUG_RESOLVER) Slog.d(TAG, tId(transaction) + "Start resolving transaction");


        final IBinder token = transaction.getActivityToken();
        if (token != null) {
            final Map<IBinder, ClientTransactionItem> activitiesToBeDestroyed =
                    mTransactionHandler.getActivitiesToBeDestroyed();
            final ClientTransactionItem destroyItem = activitiesToBeDestroyed.get(token);
            if (destroyItem != null) {
                if (transaction.getLifecycleStateRequest() == destroyItem) {
                    // It is going to execute the transaction that will destroy activity with the
                    // token, so the corresponding to-be-destroyed record can be removed.
                    activitiesToBeDestroyed.remove(token);
                }
                if (mTransactionHandler.getActivityClient(token) == null) {
                    // The activity has not been created but has been requested to destroy, so all
                    // transactions for the token are just like being cancelled.
                    Slog.w(TAG, tId(transaction) + "Skip pre-destroyed transaction:\n"
                            + transactionToString(transaction, mTransactionHandler));
                    return;
                }
            }
        }


        if (DEBUG_RESOLVER) Slog.d(TAG, transactionToString(transaction, mTransactionHandler));


        executeCallbacks(transaction);


        executeLifecycleState(transaction);
        mPendingActions.clear();
        if (DEBUG_RESOLVER) Slog.d(TAG, tId(transaction) + "End resolving transaction");
    }
}

调用TransactionExecutor的executeCallbacks方法:

//frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java
public class TransactionExecutor {
    public void executeCallbacks(ClientTransaction transaction) {
        final List<ClientTransactionItem> callbacks = transaction.getCallbacks();
        if (callbacks == null || callbacks.isEmpty()) {
            // No callbacks to execute, return early.
            return;
        }
        if (DEBUG_RESOLVER) Slog.d(TAG, tId(transaction) + "Resolving callbacks in transaction");


        final IBinder token = transaction.getActivityToken();
        ActivityClientRecord r = mTransactionHandler.getActivityClient(token);


        // In case when post-execution state of the last callback matches the final state requested
        // for the activity in this transaction, we won't do the last transition here and do it when
        // moving to final state instead (because it may contain additional parameters from server).
        final ActivityLifecycleItem finalStateRequest = transaction.getLifecycleStateRequest();
        final int finalState = finalStateRequest != null ? finalStateRequest.getTargetState()
                : UNDEFINED;
        // Index of the last callback that requests some post-execution state.
        final int lastCallbackRequestingState = lastCallbackRequestingState(transaction);


        final int size = callbacks.size();
        for (int i = 0; i < size; ++i) {
            final ClientTransactionItem item = callbacks.get(i);
            if (DEBUG_RESOLVER) Slog.d(TAG, tId(transaction) + "Resolving callback: " + item);
            final int postExecutionState = item.getPostExecutionState();
            final int closestPreExecutionState = mHelper.getClosestPreExecutionState(r,
                    item.getPostExecutionState());
            if (closestPreExecutionState != UNDEFINED) {
                cycleToPath(r, closestPreExecutionState, transaction);
            }


            item.execute(mTransactionHandler, token, mPendingActions);
            item.postExecute(mTransactionHandler, token, mPendingActions);
            if (r == null) {
                // Launch activity request will create an activity record.
                r = mTransactionHandler.getActivityClient(token);
            }


            if (postExecutionState != UNDEFINED && r != null) {
                // Skip the very last transition and perform it by explicit state request instead.
                final boolean shouldExcludeLastTransition =
                        i == lastCallbackRequestingState && finalState == postExecutionState;
                cycleToPath(r, postExecutionState, shouldExcludeLastTransition, transaction);
            }
        }
    }
}

调用item(ClientTransactionItem)的execute方法,ClientTransactionItem是一个抽象类,由其子类LaunchActivityItem实现:

//frameworks/base/core/java/android/app/servertransaction/LaunchActivityItem.java
public class LaunchActivityItem extends ClientTransactionItem {
    public void execute(ClientTransactionHandler client, IBinder token,
            PendingTransactionActions pendingActions) {
        Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
        ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo,
                mOverrideConfig, mCompatInfo, mReferrer, mVoiceInteractor, mState, mPersistentState,
                mPendingResults, mPendingNewIntents, mActivityOptions, mIsForward, mProfilerInfo,
                client, mAssistToken, mShareableActivityToken, mLaunchedFromBubble,
                mTaskFragmentToken);
        client.handleLaunchActivity(r, pendingActions, null /* customIntent */);
        Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
    }
}

ClientTransactionHandler handleLaunchActivity

调用ClientTransactionHandler的handleLaunchActivity方法:

//frameworks/base/core/java/android/app/ClientTransactionHandler.java
public abstract class ClientTransactionHandler {
    public abstract Activity handleLaunchActivity(@NonNull ActivityClientRecord r,
            PendingTransactionActions pendingActions, Intent customIntent);
}
ActivityThread handleLaunchActivity

ClientTransactionHandler是一个抽象类,由其子类ActivityThread实现,调用ActivityThread的handleLaunchActivity方法:

Android13 ActivityThread handleLaunchActivity流程分析-CSDN博客

  • 24
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在Android上重启一个Activity,可以使用 Intent 和 finish() 方法。 例如: ``` Intent intent = new Intent(CurrentActivity.this, CurrentActivity.class); finish(); startActivity(intent); ``` 首先,创建一个新的 Intent 对象,并将当前 Activity 作为上下文传入。 然后调用 finish() 方法结束当前 Activity,最后调用 startActivity(intent) 方法重新启动该 Activity。 ### 回答2: 在Android中,可以通过以下几种方式来重启Activity。 1. 使用Intent重新启动Activity:可以通过创建一个新的Intent对象,并将原Activity的类名和其他需要传递的数据传递给新的Intent,然后调用startActivity()方法来启动新的Activity,并使用finish()方法来销毁原Activity。 2. 使用FLAG_ACTIVITY_CLEAR_TOP标志重新启动Activity:可以在Intent中设置FLAG_ACTIVITY_CLEAR_TOP标志,然后调用startActivity()方法来启动新的Activity。这个标志会检查Activity的任务栈,如果需要启动的Activity已经在任务栈中存在,那么会将该Activity之上的所有Activity都销毁掉,然后重用已存在的Activity,并将其置于栈顶。 3. 使用Recreate()方法重启Activity:在Android 3.0及以上版本中,可以通过调用Activity的recreate()方法来重启Activity。这个方法会销毁当前的Activity,然后重新创建一个新的Activity,并将其置于栈顶。 需要注意的是,以上这些方法都会导致Activity的生命周期方法被重新调用,如onCreate()、onStart()、onResume()等,所以在处理重启逻辑时,需要注意保存和恢复Activity的状态。 另外,可以根据具体的需求选择合适的重启方式,如是否需要传递数据、是否需要清空任务栈等。根据不同的场景,选择合适的方法可以更好地实现Activity的重启功能。 ### 回答3: 在Android中,我们可以通过调用`startActivity()`方法来启动一个新的Activity。当我们希望重新启动当前Activity时,有以下几种常见的方法。 1. 使用`Intent.FLAG_ACTIVITY_CLEAR_TOP`标志: 通过在启动新Activity时设置`Intent.FLAG_ACTIVITY_CLEAR_TOP`标志,我们可以清除当前Activity之上的所有Activity。这样,在新的Activity启动后,原来的Activity会被销毁并被新的Activity覆盖。代码如下: ```java Intent intent = new Intent(this, NewActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); finish(); ``` 2. 使用`Intent.FLAG_ACTIVITY_NEW_TASK`标志: 通过在启动新的Activity时设置`Intent.FLAG_ACTIVITY_NEW_TASK`标志,我们可以在新的任务栈中启动新的Activity。这样,原来的Activity会被销毁,并且返回到主界面,而新的Activity将会在新的任务栈中启动。代码如下: ```java Intent intent = new Intent(this, NewActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); finish(); ``` 3. 通过重新启动Activity: 通过重新调用`onCreate()`方法和`onStart()`方法,我们可以重新启动当前Activity。代码如下: ```java Intent intent = getIntent(); finish(); startActivity(intent); ``` 以上是三种常见的Android重启Activity的方法,开发者可以根据具体的需求选择合适的方法来实现重启。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值