Loading core/java/android/app/ActivityThread.java +22 −9 Original line number Diff line number Diff line Loading @@ -237,7 +237,6 @@ import java.util.Objects; import java.util.TimeZone; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; /** Loading Loading @@ -338,6 +337,11 @@ public final class ActivityThread extends ClientTransactionHandler */ @UnsupportedAppUsage final ArrayMap<IBinder, ActivityClientRecord> mActivities = new ArrayMap<>(); /** * Maps from activity token to local record of the activities that are preparing to be launched. */ final Map<IBinder, ActivityClientRecord> mLaunchingActivities = Collections.synchronizedMap(new ArrayMap<IBinder, ActivityClientRecord>()); /** The activities to be truly destroyed (not include relaunch). */ final Map<IBinder, ClientTransactionItem> mActivitiesToBeDestroyed = Collections.synchronizedMap(new ArrayMap<IBinder, ClientTransactionItem>()); Loading @@ -347,7 +351,6 @@ public final class ActivityThread extends ClientTransactionHandler // Number of activities that are currently visible on-screen. @UnsupportedAppUsage int mNumVisibleActivities = 0; private final AtomicInteger mNumLaunchingActivities = new AtomicInteger(); @GuardedBy("mAppThread") private int mLastProcessState = PROCESS_STATE_UNKNOWN; @GuardedBy("mAppThread") Loading Loading @@ -3255,6 +3258,21 @@ public final class ActivityThread extends ClientTransactionHandler return activityRecord != null ? activityRecord.activity : null; } @Override public void addLaunchingActivity(IBinder token, ActivityClientRecord activity) { mLaunchingActivities.put(token, activity); } @Override public ActivityClientRecord getLaunchingActivity(IBinder token) { return mLaunchingActivities.get(token); } @Override public void removeLaunchingActivity(IBinder token) { mLaunchingActivities.remove(token); } @Override public ActivityClientRecord getActivityClient(IBinder token) { return mActivities.get(token); Loading Loading @@ -3299,7 +3317,7 @@ public final class ActivityThread extends ClientTransactionHandler // Defer the top state for VM to avoid aggressive JIT compilation affecting activity // launch time. if (processState == ActivityManager.PROCESS_STATE_TOP && mNumLaunchingActivities.get() > 0) { && !mLaunchingActivities.isEmpty()) { mPendingProcessState = processState; mH.postDelayed(this::applyPendingProcessState, PENDING_TOP_PROCESS_STATE_TIMEOUT); } else { Loading @@ -3315,7 +3333,7 @@ public final class ActivityThread extends ClientTransactionHandler // Handle the pending configuration if the process state is changed from cached to // non-cached. Except the case where there is a launching activity because the // LaunchActivityItem will handle it. if (wasCached && !isCachedProcessState() && mNumLaunchingActivities.get() == 0) { if (wasCached && !isCachedProcessState() && mLaunchingActivities.isEmpty()) { final Configuration pendingConfig = mConfigurationController.getPendingConfiguration(false /* clearPending */); if (pendingConfig == null) { Loading Loading @@ -3353,11 +3371,6 @@ public final class ActivityThread extends ClientTransactionHandler } } @Override public void countLaunchingActivities(int num) { mNumLaunchingActivities.getAndAdd(num); } @UnsupportedAppUsage public final void sendActivityResult( IBinder token, String id, int requestCode, Loading core/java/android/app/ClientTransactionHandler.java +20 −3 Original line number Diff line number Diff line Loading @@ -82,9 +82,6 @@ public abstract class ClientTransactionHandler { /** Set current process state. */ public abstract void updateProcessState(int processState, boolean fromIpc); /** Count how many activities are launching. */ public abstract void countLaunchingActivities(int num); // Execute phase related logic and handlers. Methods here execute actual lifecycle transactions // and deliver callbacks. Loading Loading @@ -192,6 +189,26 @@ public abstract class ClientTransactionHandler { public abstract void handleFixedRotationAdjustments(IBinder token, FixedRotationAdjustments fixedRotationAdjustments); /** * Add {@link ActivityClientRecord} that is preparing to be launched. * @param token Activity token. * @param activity An initialized instance of {@link ActivityClientRecord} to use during launch. */ public abstract void addLaunchingActivity(IBinder token, ActivityClientRecord activity); /** * Get {@link ActivityClientRecord} that is preparing to be launched. * @param token Activity token. * @return An initialized instance of {@link ActivityClientRecord} to use during launch. */ public abstract ActivityClientRecord getLaunchingActivity(IBinder token); /** * Remove {@link ActivityClientRecord} from the launching activity list. * @param token Activity token. */ public abstract void removeLaunchingActivity(IBinder token); /** * Get {@link android.app.ActivityThread.ActivityClientRecord} instance that corresponds to the * provided token. Loading core/java/android/app/servertransaction/ActivityConfigurationChangeItem.java +2 −1 Original line number Diff line number Diff line Loading @@ -40,7 +40,8 @@ public class ActivityConfigurationChangeItem extends ActivityTransactionItem { @Override public void preExecute(android.app.ClientTransactionHandler client, IBinder token) { final ActivityClientRecord r = getActivityClientRecord(client, token); final ActivityClientRecord r = getActivityClientRecord(client, token, true /* includeLaunching */); // Notify the client of an upcoming change in the token configuration. This ensures that // batches of config change items only process the newest configuration. client.updatePendingActivityConfiguration(r, mConfiguration); Loading core/java/android/app/servertransaction/ActivityTransactionItem.java +30 −5 Original line number Diff line number Diff line Loading @@ -55,15 +55,40 @@ public abstract class ActivityTransactionItem extends ClientTransactionItem { @NonNull ActivityClientRecord getActivityClientRecord( @NonNull ClientTransactionHandler client, IBinder token) { final ActivityClientRecord r = client.getActivityClient(token); if (r == null) { throw new IllegalArgumentException("Activity client record must not be null to execute " + "transaction item"); return getActivityClientRecord(client, token, false /* includeLaunching */); } /** * Get the {@link ActivityClientRecord} instance that corresponds to the provided token. * @param client Target client handler. * @param token Target activity token. * @param includeLaunching Indicate to also find the {@link ActivityClientRecord} in launching * activity list. It should be noted that there is no activity in * {@link ActivityClientRecord} from the launching activity list. * @return The {@link ActivityClientRecord} instance that corresponds to the provided token. */ @NonNull ActivityClientRecord getActivityClientRecord( @NonNull ClientTransactionHandler client, IBinder token, boolean includeLaunching) { ActivityClientRecord r = client.getActivityClient(token); if (r != null) { if (client.getActivity(token) == null) { throw new IllegalArgumentException("Activity must not be null to execute " + "transaction item"); } return r; } // The activity may not be launched yet. Fallback to check launching activity. if (includeLaunching) { r = client.getLaunchingActivity(token); } if (r == null) { throw new IllegalArgumentException("Activity client record must not be null to execute " + "transaction item"); } // We don't need to check the activity of launching activity client records because they // have not been launched yet. return r; } } core/java/android/app/servertransaction/LaunchActivityItem.java +8 −7 Original line number Diff line number Diff line Loading @@ -82,7 +82,12 @@ public class LaunchActivityItem extends ClientTransactionItem { @Override public void preExecute(ClientTransactionHandler client, IBinder token) { client.countLaunchingActivities(1); ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo, mOverrideConfig, mCompatInfo, mReferrer, mVoiceInteractor, mState, mPersistentState, mPendingResults, mPendingNewIntents, mActivityOptions, mIsForward, mProfilerInfo, client, mAssistToken, mFixedRotationAdjustments, mShareableActivityToken, mLaunchedFromBubble); client.addLaunchingActivity(token, r); client.updateProcessState(mProcState, false); client.updatePendingConfiguration(mCurConfig); if (mActivityClientController != null) { Loading @@ -94,11 +99,7 @@ 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, mFixedRotationAdjustments, mShareableActivityToken, mLaunchedFromBubble); ActivityClientRecord r = client.getLaunchingActivity(token); client.handleLaunchActivity(r, pendingActions, null /* customIntent */); Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); } Loading @@ -106,7 +107,7 @@ public class LaunchActivityItem extends ClientTransactionItem { @Override public void postExecute(ClientTransactionHandler client, IBinder token, PendingTransactionActions pendingActions) { client.countLaunchingActivities(-1); client.removeLaunchingActivity(token); } Loading Loading
core/java/android/app/ActivityThread.java +22 −9 Original line number Diff line number Diff line Loading @@ -237,7 +237,6 @@ import java.util.Objects; import java.util.TimeZone; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; /** Loading Loading @@ -338,6 +337,11 @@ public final class ActivityThread extends ClientTransactionHandler */ @UnsupportedAppUsage final ArrayMap<IBinder, ActivityClientRecord> mActivities = new ArrayMap<>(); /** * Maps from activity token to local record of the activities that are preparing to be launched. */ final Map<IBinder, ActivityClientRecord> mLaunchingActivities = Collections.synchronizedMap(new ArrayMap<IBinder, ActivityClientRecord>()); /** The activities to be truly destroyed (not include relaunch). */ final Map<IBinder, ClientTransactionItem> mActivitiesToBeDestroyed = Collections.synchronizedMap(new ArrayMap<IBinder, ClientTransactionItem>()); Loading @@ -347,7 +351,6 @@ public final class ActivityThread extends ClientTransactionHandler // Number of activities that are currently visible on-screen. @UnsupportedAppUsage int mNumVisibleActivities = 0; private final AtomicInteger mNumLaunchingActivities = new AtomicInteger(); @GuardedBy("mAppThread") private int mLastProcessState = PROCESS_STATE_UNKNOWN; @GuardedBy("mAppThread") Loading Loading @@ -3255,6 +3258,21 @@ public final class ActivityThread extends ClientTransactionHandler return activityRecord != null ? activityRecord.activity : null; } @Override public void addLaunchingActivity(IBinder token, ActivityClientRecord activity) { mLaunchingActivities.put(token, activity); } @Override public ActivityClientRecord getLaunchingActivity(IBinder token) { return mLaunchingActivities.get(token); } @Override public void removeLaunchingActivity(IBinder token) { mLaunchingActivities.remove(token); } @Override public ActivityClientRecord getActivityClient(IBinder token) { return mActivities.get(token); Loading Loading @@ -3299,7 +3317,7 @@ public final class ActivityThread extends ClientTransactionHandler // Defer the top state for VM to avoid aggressive JIT compilation affecting activity // launch time. if (processState == ActivityManager.PROCESS_STATE_TOP && mNumLaunchingActivities.get() > 0) { && !mLaunchingActivities.isEmpty()) { mPendingProcessState = processState; mH.postDelayed(this::applyPendingProcessState, PENDING_TOP_PROCESS_STATE_TIMEOUT); } else { Loading @@ -3315,7 +3333,7 @@ public final class ActivityThread extends ClientTransactionHandler // Handle the pending configuration if the process state is changed from cached to // non-cached. Except the case where there is a launching activity because the // LaunchActivityItem will handle it. if (wasCached && !isCachedProcessState() && mNumLaunchingActivities.get() == 0) { if (wasCached && !isCachedProcessState() && mLaunchingActivities.isEmpty()) { final Configuration pendingConfig = mConfigurationController.getPendingConfiguration(false /* clearPending */); if (pendingConfig == null) { Loading Loading @@ -3353,11 +3371,6 @@ public final class ActivityThread extends ClientTransactionHandler } } @Override public void countLaunchingActivities(int num) { mNumLaunchingActivities.getAndAdd(num); } @UnsupportedAppUsage public final void sendActivityResult( IBinder token, String id, int requestCode, Loading
core/java/android/app/ClientTransactionHandler.java +20 −3 Original line number Diff line number Diff line Loading @@ -82,9 +82,6 @@ public abstract class ClientTransactionHandler { /** Set current process state. */ public abstract void updateProcessState(int processState, boolean fromIpc); /** Count how many activities are launching. */ public abstract void countLaunchingActivities(int num); // Execute phase related logic and handlers. Methods here execute actual lifecycle transactions // and deliver callbacks. Loading Loading @@ -192,6 +189,26 @@ public abstract class ClientTransactionHandler { public abstract void handleFixedRotationAdjustments(IBinder token, FixedRotationAdjustments fixedRotationAdjustments); /** * Add {@link ActivityClientRecord} that is preparing to be launched. * @param token Activity token. * @param activity An initialized instance of {@link ActivityClientRecord} to use during launch. */ public abstract void addLaunchingActivity(IBinder token, ActivityClientRecord activity); /** * Get {@link ActivityClientRecord} that is preparing to be launched. * @param token Activity token. * @return An initialized instance of {@link ActivityClientRecord} to use during launch. */ public abstract ActivityClientRecord getLaunchingActivity(IBinder token); /** * Remove {@link ActivityClientRecord} from the launching activity list. * @param token Activity token. */ public abstract void removeLaunchingActivity(IBinder token); /** * Get {@link android.app.ActivityThread.ActivityClientRecord} instance that corresponds to the * provided token. Loading
core/java/android/app/servertransaction/ActivityConfigurationChangeItem.java +2 −1 Original line number Diff line number Diff line Loading @@ -40,7 +40,8 @@ public class ActivityConfigurationChangeItem extends ActivityTransactionItem { @Override public void preExecute(android.app.ClientTransactionHandler client, IBinder token) { final ActivityClientRecord r = getActivityClientRecord(client, token); final ActivityClientRecord r = getActivityClientRecord(client, token, true /* includeLaunching */); // Notify the client of an upcoming change in the token configuration. This ensures that // batches of config change items only process the newest configuration. client.updatePendingActivityConfiguration(r, mConfiguration); Loading
core/java/android/app/servertransaction/ActivityTransactionItem.java +30 −5 Original line number Diff line number Diff line Loading @@ -55,15 +55,40 @@ public abstract class ActivityTransactionItem extends ClientTransactionItem { @NonNull ActivityClientRecord getActivityClientRecord( @NonNull ClientTransactionHandler client, IBinder token) { final ActivityClientRecord r = client.getActivityClient(token); if (r == null) { throw new IllegalArgumentException("Activity client record must not be null to execute " + "transaction item"); return getActivityClientRecord(client, token, false /* includeLaunching */); } /** * Get the {@link ActivityClientRecord} instance that corresponds to the provided token. * @param client Target client handler. * @param token Target activity token. * @param includeLaunching Indicate to also find the {@link ActivityClientRecord} in launching * activity list. It should be noted that there is no activity in * {@link ActivityClientRecord} from the launching activity list. * @return The {@link ActivityClientRecord} instance that corresponds to the provided token. */ @NonNull ActivityClientRecord getActivityClientRecord( @NonNull ClientTransactionHandler client, IBinder token, boolean includeLaunching) { ActivityClientRecord r = client.getActivityClient(token); if (r != null) { if (client.getActivity(token) == null) { throw new IllegalArgumentException("Activity must not be null to execute " + "transaction item"); } return r; } // The activity may not be launched yet. Fallback to check launching activity. if (includeLaunching) { r = client.getLaunchingActivity(token); } if (r == null) { throw new IllegalArgumentException("Activity client record must not be null to execute " + "transaction item"); } // We don't need to check the activity of launching activity client records because they // have not been launched yet. return r; } }
core/java/android/app/servertransaction/LaunchActivityItem.java +8 −7 Original line number Diff line number Diff line Loading @@ -82,7 +82,12 @@ public class LaunchActivityItem extends ClientTransactionItem { @Override public void preExecute(ClientTransactionHandler client, IBinder token) { client.countLaunchingActivities(1); ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo, mOverrideConfig, mCompatInfo, mReferrer, mVoiceInteractor, mState, mPersistentState, mPendingResults, mPendingNewIntents, mActivityOptions, mIsForward, mProfilerInfo, client, mAssistToken, mFixedRotationAdjustments, mShareableActivityToken, mLaunchedFromBubble); client.addLaunchingActivity(token, r); client.updateProcessState(mProcState, false); client.updatePendingConfiguration(mCurConfig); if (mActivityClientController != null) { Loading @@ -94,11 +99,7 @@ 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, mFixedRotationAdjustments, mShareableActivityToken, mLaunchedFromBubble); ActivityClientRecord r = client.getLaunchingActivity(token); client.handleLaunchActivity(r, pendingActions, null /* customIntent */); Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); } Loading @@ -106,7 +107,7 @@ public class LaunchActivityItem extends ClientTransactionItem { @Override public void postExecute(ClientTransactionHandler client, IBinder token, PendingTransactionActions pendingActions) { client.countLaunchingActivities(-1); client.removeLaunchingActivity(token); } Loading