Loading core/java/android/app/ActivityThread.java +23 −10 Original line number Diff line number Diff line Loading @@ -4034,9 +4034,11 @@ public final class ActivityThread extends ClientTransactionHandler { r.setState(ON_PAUSE); } /** Called from {@link LocalActivityManager}. */ final void performStopActivity(IBinder token, boolean saveState, String reason) { ActivityClientRecord r = mActivities.get(token); performStopActivityInner(r, null, false, saveState, reason); performStopActivityInner(r, null /* stopInfo */, false /* keepShown */, saveState, false /* finalStateRequest */, reason); } private static final class ProviderRefCount { Loading Loading @@ -4068,9 +4070,16 @@ public final class ActivityThread extends ClientTransactionHandler { * it the result when it is done, but the window may still be visible. * For the client, we want to call onStop()/onStart() to indicate when * the activity's UI visibility changes. * @param r Target activity client record. * @param info Action that will report activity stop to server. * @param keepShown Flag indicating whether the activity is still shown. * @param saveState Flag indicating whether the activity state should be saved. * @param finalStateRequest Flag indicating if this call is handling final lifecycle state * request for a transaction. * @param reason Reason for performing this operation. */ private void performStopActivityInner(ActivityClientRecord r, StopInfo info, boolean keepShown, boolean saveState, String reason) { boolean saveState, boolean finalStateRequest, String reason) { if (localLOGV) Slog.v(TAG, "Performing stop of " + r); if (r != null) { if (!keepShown && r.stopped) { Loading @@ -4080,12 +4089,14 @@ public final class ActivityThread extends ClientTransactionHandler { // if the activity isn't resumed. return; } RuntimeException e = new RuntimeException( if (!finalStateRequest) { final RuntimeException e = new RuntimeException( "Performing stop of activity that is already stopped: " + r.intent.getComponent().toShortString()); Slog.e(TAG, e.getMessage(), e); Slog.e(TAG, r.getStateString()); } } // One must first be paused before stopped... performPauseActivityIfNeeded(r, reason); Loading Loading @@ -4177,12 +4188,13 @@ public final class ActivityThread extends ClientTransactionHandler { @Override public void handleStopActivity(IBinder token, boolean show, int configChanges, PendingTransactionActions pendingActions, String reason) { PendingTransactionActions pendingActions, boolean finalStateRequest, String reason) { final ActivityClientRecord r = mActivities.get(token); r.activity.mConfigChangeFlags |= configChanges; final StopInfo stopInfo = new StopInfo(); performStopActivityInner(r, stopInfo, show, true, reason); performStopActivityInner(r, stopInfo, show, true /* saveState */, finalStateRequest, reason); if (localLOGV) Slog.v( TAG, "Finishing stop of " + r + ": show=" + show Loading Loading @@ -4234,7 +4246,8 @@ public final class ActivityThread extends ClientTransactionHandler { } if (!show && !r.stopped) { performStopActivityInner(r, null, show, false, "handleWindowVisibility"); performStopActivityInner(r, null /* stopInfo */, show, false /* saveState */, false /* finalStateRequest */, "handleWindowVisibility"); } else if (show && r.stopped) { // If we are getting ready to gc after going to the background, well // we are back active so skip it. Loading core/java/android/app/ClientTransactionHandler.java +12 −2 Original line number Diff line number Diff line Loading @@ -78,9 +78,19 @@ public abstract class ClientTransactionHandler { public abstract void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward, String reason); /** Stop the activity. */ /** * Stop the activity. * @param token Target activity token. * @param show Flag indicating whether activity is still shown. * @param configChanges Activity configuration changes. * @param pendingActions Pending actions to be used on this or later stages of activity * transaction. * @param finalStateRequest Flag indicating if this call is handling final lifecycle state * request for a transaction. * @param reason Reason for performing this operation. */ public abstract void handleStopActivity(IBinder token, boolean show, int configChanges, PendingTransactionActions pendingActions, String reason); PendingTransactionActions pendingActions, boolean finalStateRequest, String reason); /** Report that activity was stopped to server. */ public abstract void reportStop(PendingTransactionActions pendingActions); Loading core/java/android/app/servertransaction/StopActivityItem.java +1 −1 Original line number Diff line number Diff line Loading @@ -39,7 +39,7 @@ public class StopActivityItem extends ActivityLifecycleItem { PendingTransactionActions pendingActions) { Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStop"); client.handleStopActivity(token, mShowWindow, mConfigChanges, pendingActions, "STOP_ACTIVITY_ITEM"); true /* finalStateRequest */, "STOP_ACTIVITY_ITEM"); Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); } Loading core/java/android/app/servertransaction/TransactionExecutor.java +2 −1 Original line number Diff line number Diff line Loading @@ -204,7 +204,8 @@ public class TransactionExecutor { break; case ON_STOP: mTransactionHandler.handleStopActivity(r.token, false /* show */, 0 /* configChanges */, mPendingActions, "LIFECYCLER_STOP_ACTIVITY"); 0 /* configChanges */, mPendingActions, false /* finalStateRequest */, "LIFECYCLER_STOP_ACTIVITY"); break; case ON_DESTROY: mTransactionHandler.handleDestroyActivity(r.token, false /* finishing */, Loading core/tests/coretests/src/android/app/activity/ActivityThreadTest.java +33 −8 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.app.servertransaction.ActivityRelaunchItem; import android.app.servertransaction.ClientTransaction; import android.app.servertransaction.ClientTransactionItem; import android.app.servertransaction.ResumeActivityItem; import android.app.servertransaction.StopActivityItem; import android.content.Intent; import android.support.test.InstrumentationRegistry; import android.support.test.filters.MediumTest; Loading @@ -34,6 +35,8 @@ import org.junit.runner.RunWith; /** * Test for verifying {@link android.app.ActivityThread} class. * Build/Install/Run: * atest FrameworksCoreTests:android.app.activity.ActivityThreadTest */ @RunWith(AndroidJUnit4.class) @MediumTest Loading Loading @@ -63,15 +66,23 @@ public class ActivityThreadTest { InstrumentationRegistry.getInstrumentation().waitForIdleSync(); } @Test public void testSleepAndStop() throws Exception { final Activity activity = mActivityTestRule.launchActivity(new Intent()); final IApplicationThread appThread = activity.getActivityThread().getApplicationThread(); appThread.scheduleSleeping(activity.getActivityToken(), true /* sleeping */); appThread.scheduleTransaction(newStopTransaction(activity)); InstrumentationRegistry.getInstrumentation().waitForIdleSync(); } private static ClientTransaction newRelaunchResumeTransaction(Activity activity) { final ClientTransactionItem callbackItem = ActivityRelaunchItem.obtain(null, null, 0, new MergedConfiguration(), false /* preserveWindow */); null, 0, new MergedConfiguration(), false /* preserveWindow */); final ResumeActivityItem resumeStateRequest = ResumeActivityItem.obtain(true /* isForward */); final IApplicationThread appThread = activity.getActivityThread().getApplicationThread(); final ClientTransaction transaction = ClientTransaction.obtain(appThread, activity.getActivityToken()); final ClientTransaction transaction = newTransaction(activity); transaction.addCallback(callbackItem); transaction.setLifecycleStateRequest(resumeStateRequest); Loading @@ -81,14 +92,28 @@ public class ActivityThreadTest { private static ClientTransaction newResumeTransaction(Activity activity) { final ResumeActivityItem resumeStateRequest = ResumeActivityItem.obtain(true /* isForward */); final IApplicationThread appThread = activity.getActivityThread().getApplicationThread(); final ClientTransaction transaction = ClientTransaction.obtain(appThread, activity.getActivityToken()); final ClientTransaction transaction = newTransaction(activity); transaction.setLifecycleStateRequest(resumeStateRequest); return transaction; } private static ClientTransaction newStopTransaction(Activity activity) { final StopActivityItem stopStateRequest = StopActivityItem.obtain(false /* showWindow */, 0 /* configChanges */); final ClientTransaction transaction = newTransaction(activity); transaction.setLifecycleStateRequest(stopStateRequest); return transaction; } private static ClientTransaction newTransaction(Activity activity) { final IApplicationThread appThread = activity.getActivityThread().getApplicationThread(); return ClientTransaction.obtain(appThread, activity.getActivityToken()); } // Test activity public static class TestActivity extends Activity { } Loading Loading
core/java/android/app/ActivityThread.java +23 −10 Original line number Diff line number Diff line Loading @@ -4034,9 +4034,11 @@ public final class ActivityThread extends ClientTransactionHandler { r.setState(ON_PAUSE); } /** Called from {@link LocalActivityManager}. */ final void performStopActivity(IBinder token, boolean saveState, String reason) { ActivityClientRecord r = mActivities.get(token); performStopActivityInner(r, null, false, saveState, reason); performStopActivityInner(r, null /* stopInfo */, false /* keepShown */, saveState, false /* finalStateRequest */, reason); } private static final class ProviderRefCount { Loading Loading @@ -4068,9 +4070,16 @@ public final class ActivityThread extends ClientTransactionHandler { * it the result when it is done, but the window may still be visible. * For the client, we want to call onStop()/onStart() to indicate when * the activity's UI visibility changes. * @param r Target activity client record. * @param info Action that will report activity stop to server. * @param keepShown Flag indicating whether the activity is still shown. * @param saveState Flag indicating whether the activity state should be saved. * @param finalStateRequest Flag indicating if this call is handling final lifecycle state * request for a transaction. * @param reason Reason for performing this operation. */ private void performStopActivityInner(ActivityClientRecord r, StopInfo info, boolean keepShown, boolean saveState, String reason) { boolean saveState, boolean finalStateRequest, String reason) { if (localLOGV) Slog.v(TAG, "Performing stop of " + r); if (r != null) { if (!keepShown && r.stopped) { Loading @@ -4080,12 +4089,14 @@ public final class ActivityThread extends ClientTransactionHandler { // if the activity isn't resumed. return; } RuntimeException e = new RuntimeException( if (!finalStateRequest) { final RuntimeException e = new RuntimeException( "Performing stop of activity that is already stopped: " + r.intent.getComponent().toShortString()); Slog.e(TAG, e.getMessage(), e); Slog.e(TAG, r.getStateString()); } } // One must first be paused before stopped... performPauseActivityIfNeeded(r, reason); Loading Loading @@ -4177,12 +4188,13 @@ public final class ActivityThread extends ClientTransactionHandler { @Override public void handleStopActivity(IBinder token, boolean show, int configChanges, PendingTransactionActions pendingActions, String reason) { PendingTransactionActions pendingActions, boolean finalStateRequest, String reason) { final ActivityClientRecord r = mActivities.get(token); r.activity.mConfigChangeFlags |= configChanges; final StopInfo stopInfo = new StopInfo(); performStopActivityInner(r, stopInfo, show, true, reason); performStopActivityInner(r, stopInfo, show, true /* saveState */, finalStateRequest, reason); if (localLOGV) Slog.v( TAG, "Finishing stop of " + r + ": show=" + show Loading Loading @@ -4234,7 +4246,8 @@ public final class ActivityThread extends ClientTransactionHandler { } if (!show && !r.stopped) { performStopActivityInner(r, null, show, false, "handleWindowVisibility"); performStopActivityInner(r, null /* stopInfo */, show, false /* saveState */, false /* finalStateRequest */, "handleWindowVisibility"); } else if (show && r.stopped) { // If we are getting ready to gc after going to the background, well // we are back active so skip it. Loading
core/java/android/app/ClientTransactionHandler.java +12 −2 Original line number Diff line number Diff line Loading @@ -78,9 +78,19 @@ public abstract class ClientTransactionHandler { public abstract void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward, String reason); /** Stop the activity. */ /** * Stop the activity. * @param token Target activity token. * @param show Flag indicating whether activity is still shown. * @param configChanges Activity configuration changes. * @param pendingActions Pending actions to be used on this or later stages of activity * transaction. * @param finalStateRequest Flag indicating if this call is handling final lifecycle state * request for a transaction. * @param reason Reason for performing this operation. */ public abstract void handleStopActivity(IBinder token, boolean show, int configChanges, PendingTransactionActions pendingActions, String reason); PendingTransactionActions pendingActions, boolean finalStateRequest, String reason); /** Report that activity was stopped to server. */ public abstract void reportStop(PendingTransactionActions pendingActions); Loading
core/java/android/app/servertransaction/StopActivityItem.java +1 −1 Original line number Diff line number Diff line Loading @@ -39,7 +39,7 @@ public class StopActivityItem extends ActivityLifecycleItem { PendingTransactionActions pendingActions) { Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStop"); client.handleStopActivity(token, mShowWindow, mConfigChanges, pendingActions, "STOP_ACTIVITY_ITEM"); true /* finalStateRequest */, "STOP_ACTIVITY_ITEM"); Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); } Loading
core/java/android/app/servertransaction/TransactionExecutor.java +2 −1 Original line number Diff line number Diff line Loading @@ -204,7 +204,8 @@ public class TransactionExecutor { break; case ON_STOP: mTransactionHandler.handleStopActivity(r.token, false /* show */, 0 /* configChanges */, mPendingActions, "LIFECYCLER_STOP_ACTIVITY"); 0 /* configChanges */, mPendingActions, false /* finalStateRequest */, "LIFECYCLER_STOP_ACTIVITY"); break; case ON_DESTROY: mTransactionHandler.handleDestroyActivity(r.token, false /* finishing */, Loading
core/tests/coretests/src/android/app/activity/ActivityThreadTest.java +33 −8 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.app.servertransaction.ActivityRelaunchItem; import android.app.servertransaction.ClientTransaction; import android.app.servertransaction.ClientTransactionItem; import android.app.servertransaction.ResumeActivityItem; import android.app.servertransaction.StopActivityItem; import android.content.Intent; import android.support.test.InstrumentationRegistry; import android.support.test.filters.MediumTest; Loading @@ -34,6 +35,8 @@ import org.junit.runner.RunWith; /** * Test for verifying {@link android.app.ActivityThread} class. * Build/Install/Run: * atest FrameworksCoreTests:android.app.activity.ActivityThreadTest */ @RunWith(AndroidJUnit4.class) @MediumTest Loading Loading @@ -63,15 +66,23 @@ public class ActivityThreadTest { InstrumentationRegistry.getInstrumentation().waitForIdleSync(); } @Test public void testSleepAndStop() throws Exception { final Activity activity = mActivityTestRule.launchActivity(new Intent()); final IApplicationThread appThread = activity.getActivityThread().getApplicationThread(); appThread.scheduleSleeping(activity.getActivityToken(), true /* sleeping */); appThread.scheduleTransaction(newStopTransaction(activity)); InstrumentationRegistry.getInstrumentation().waitForIdleSync(); } private static ClientTransaction newRelaunchResumeTransaction(Activity activity) { final ClientTransactionItem callbackItem = ActivityRelaunchItem.obtain(null, null, 0, new MergedConfiguration(), false /* preserveWindow */); null, 0, new MergedConfiguration(), false /* preserveWindow */); final ResumeActivityItem resumeStateRequest = ResumeActivityItem.obtain(true /* isForward */); final IApplicationThread appThread = activity.getActivityThread().getApplicationThread(); final ClientTransaction transaction = ClientTransaction.obtain(appThread, activity.getActivityToken()); final ClientTransaction transaction = newTransaction(activity); transaction.addCallback(callbackItem); transaction.setLifecycleStateRequest(resumeStateRequest); Loading @@ -81,14 +92,28 @@ public class ActivityThreadTest { private static ClientTransaction newResumeTransaction(Activity activity) { final ResumeActivityItem resumeStateRequest = ResumeActivityItem.obtain(true /* isForward */); final IApplicationThread appThread = activity.getActivityThread().getApplicationThread(); final ClientTransaction transaction = ClientTransaction.obtain(appThread, activity.getActivityToken()); final ClientTransaction transaction = newTransaction(activity); transaction.setLifecycleStateRequest(resumeStateRequest); return transaction; } private static ClientTransaction newStopTransaction(Activity activity) { final StopActivityItem stopStateRequest = StopActivityItem.obtain(false /* showWindow */, 0 /* configChanges */); final ClientTransaction transaction = newTransaction(activity); transaction.setLifecycleStateRequest(stopStateRequest); return transaction; } private static ClientTransaction newTransaction(Activity activity) { final IApplicationThread appThread = activity.getActivityThread().getApplicationThread(); return ClientTransaction.obtain(appThread, activity.getActivityToken()); } // Test activity public static class TestActivity extends Activity { } Loading