Merge "Don't throw exception for duplicate stop" into pi-dev
am: 002e0ef06e
Change-Id: I70a17eb1b923871536721aa77442a85d18b49c74
This commit is contained in:
@@ -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 {
|
||||
@@ -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) {
|
||||
@@ -4080,11 +4089,13 @@ public final class ActivityThread extends ClientTransactionHandler {
|
||||
// if the activity isn't resumed.
|
||||
return;
|
||||
}
|
||||
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());
|
||||
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...
|
||||
@@ -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
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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 */,
|
||||
|
||||
@@ -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;
|
||||
@@ -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
|
||||
@@ -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);
|
||||
|
||||
@@ -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 {
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user