1 /*
2  * Copyright (C) 2018 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License
15  */
16 
17 package android.server.wm.lifecycle;
18 
19 import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK;
20 import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
21 import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
22 import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
23 import static android.content.Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP;
24 import static android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP;
25 import static android.server.wm.ActivityManagerState.STATE_DESTROYED;
26 import static android.server.wm.ActivityManagerState.STATE_RESUMED;
27 import static android.server.wm.ComponentNameUtils.getActivityName;
28 import static android.server.wm.app.Components.ALIAS_TEST_ACTIVITY;
29 import static android.server.wm.app.Components.TEST_ACTIVITY;
30 import static android.server.wm.lifecycle.LifecycleLog.ActivityCallback.ON_RESUME;
31 
32 import static org.junit.Assert.assertEquals;
33 import static org.junit.Assert.assertNotEquals;
34 
35 import android.app.Activity;
36 import android.content.ComponentName;
37 import android.content.Intent;
38 import android.os.Bundle;
39 import android.platform.test.annotations.Presubmit;
40 import android.server.wm.ActivityLauncher;
41 
42 import org.junit.Test;
43 
44 /**
45  * Build/Install/Run:
46  *     atest CtsWindowManagerDeviceTestCases:ActivityStarterTests
47  */
48 @Presubmit
49 public class ActivityStarterTests extends ActivityLifecycleClientTestBase {
50 
51     private static final ComponentName STANDARD_ACTIVITY
52             = getComponentName(StandardActivity.class);
53     private static final ComponentName SECOND_STANDARD_ACTIVITY
54             = getComponentName(SecondStandardActivity.class);
55     private static final ComponentName SINGLE_TOP_ACTIVITY
56             = getComponentName(SingleTopActivity.class);
57     private static final ComponentName SINGLE_INSTANCE_ACTIVITY
58             = getComponentName(SingleInstanceActivity.class);
59     private static final ComponentName SINGLE_TASK_ACTIVITY
60             = getComponentName(SingleTaskActivity.class);
61     private static final ComponentName STANDARD_SINGLE_TOP_ACTIVITY
62             = getComponentName(StandardWithSingleTopActivity.class);
63     private static final ComponentName TEST_LAUNCHING_ACTIVITY
64             = getComponentName(TestLaunchingActivity.class);
65     private static final ComponentName LAUNCHING_AND_FINISH_ACTIVITY
66             = getComponentName(LaunchingAndFinishActivity.class);
67 
68 
69     /**
70      * Ensures that the following launch flag combination works when starting an activity which is
71      * already running:
72      * - {@code FLAG_ACTIVITY_CLEAR_TOP}
73      * - {@code FLAG_ACTIVITY_RESET_TASK_IF_NEEDED}
74      * - {@code FLAG_ACTIVITY_NEW_TASK}
75      */
76     @Test
testClearTopNewTaskResetTask()77     public void testClearTopNewTaskResetTask() throws Exception {
78         // Start activity normally
79         final Activity initialActivity = mFirstActivityTestRule.launchActivity(new Intent());
80         waitAndAssertActivityStates(state(initialActivity, ON_RESUME));
81 
82         // Navigate home
83         launchHomeActivity();
84 
85         // Start activity again with flags in question. Verify activity is resumed.
86         final Intent intent = new Intent().addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
87                 | Intent.FLAG_ACTIVITY_NEW_TASK
88                 | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
89         final Activity secondLaunchActivity = mFirstActivityTestRule.launchActivity(intent);
90         mAmWmState.waitForActivityState(secondLaunchActivity.getComponentName(), STATE_RESUMED);
91         assertEquals("The activity should be started and be resumed",
92                 getActivityName(secondLaunchActivity.getComponentName()),
93                 mAmWmState.getAmState().getTopActivityName(0));
94     }
95 
96     /**
97      * This test case tests "standard" activity behavior.
98      * A first launched standard activity and a second launched standard activity
99      * must be in same task.
100      */
101     @Test
testLaunchStandardActivity()102     public void testLaunchStandardActivity() {
103         // Launch a standard activity.
104         launchActivity(STANDARD_ACTIVITY);
105 
106         final int taskId = mAmWmState.getAmState().getTaskByActivity(STANDARD_ACTIVITY).getTaskId();
107         final int instances = mAmWmState.getAmState().getActivityCountInTask(taskId, null);
108 
109         // Launch a second standard activity.
110         launchActivity(SECOND_STANDARD_ACTIVITY);
111 
112         // Make sure instances in task are increased.
113         assertEquals("instances of activity in task must be increased.", instances + 1,
114                 mAmWmState.getAmState().getActivityCountInTask(taskId, null));
115 
116         // Make sure the stack for the second standard activity is front.
117         assertEquals("The stack for the second standard activity must be front.",
118                 getActivityName(SECOND_STANDARD_ACTIVITY),
119                 mAmWmState.getAmState().getTopActivityName(0));
120 
121         // Make sure the standard activity and the second standard activity are in same task.
122         assertEquals("Activity must be in same task.", taskId,
123                 mAmWmState.getAmState().getTaskByActivity(SECOND_STANDARD_ACTIVITY).getTaskId());
124     }
125 
126     /**
127      * This test case tests "single top" activity behavior.
128      * - A first launched standard activity and a second launched single top
129      * activity are in same task.
130      * - A new instance of single top activity is not created if task
131      * already has a its activity at the top of its task.
132      */
133     @Test
testLaunchSingleTopActivity()134     public void testLaunchSingleTopActivity() {
135         // Launch a standard activity.
136         launchActivity(STANDARD_ACTIVITY);
137 
138         final int taskId = mAmWmState.getAmState().getTaskByActivity(STANDARD_ACTIVITY).getTaskId();
139 
140         // Launch a single top activity.
141         launchActivity(SINGLE_TOP_ACTIVITY);
142 
143         final int instances = mAmWmState.getAmState().getActivityCountInTask(taskId, null);
144 
145         // Make sure the single top activity is in focus.
146         mAmWmState.assertFocusedActivity(SINGLE_TOP_ACTIVITY + "must be focused Activity",
147                 SINGLE_TOP_ACTIVITY);
148 
149         // Make sure the stack for the single top activity is front.
150         assertEquals("The stack for the single top activity must be front.",
151                 getActivityName(SINGLE_TOP_ACTIVITY),
152                 mAmWmState.getAmState().getTopActivityName(0));
153 
154         // Make sure the standard activity and the single top activity are in same task.
155         assertEquals("Two activities must be in same task.", taskId,
156                 mAmWmState.getAmState().getTaskByActivity(SINGLE_TOP_ACTIVITY).getTaskId());
157 
158         // Launch a single top activity.
159         launchActivity(SINGLE_TOP_ACTIVITY);
160 
161         // Make sure that instances of activity are not increased.
162         assertEquals("instances of activity must not be increased.", instances,
163                 mAmWmState.getAmState().getActivityCountInTask(taskId, null));
164     }
165 
166     /**
167      * This test case tests "single instance" activity behavior.
168      * - A first launched standard activity and a second launched single instance
169      * activity are not in same task.
170      * - A single instance activity is always the single and only member of its task.
171      */
172     @Test
testLaunchSingleInstanceActivity()173     public void testLaunchSingleInstanceActivity() {
174         // Launch a standard activity.
175         launchActivity(STANDARD_ACTIVITY);
176 
177         final int firstTaskId = mAmWmState.getAmState()
178                 .getTaskByActivity(STANDARD_ACTIVITY).getTaskId();
179 
180         // Launch a single instance activity
181         launchActivity(SINGLE_INSTANCE_ACTIVITY);
182 
183         final int secondTaskId = mAmWmState.getAmState()
184                 .getTaskByActivity(SINGLE_INSTANCE_ACTIVITY).getTaskId();
185 
186         // Make sure the single instance activity is in focus.
187         mAmWmState.assertFocusedActivity(SINGLE_INSTANCE_ACTIVITY + "must be focused Activity",
188                 SINGLE_INSTANCE_ACTIVITY);
189         // Make sure the single instance activity is front.
190         assertEquals("The stack for the single instance activity must be front.",
191                 getActivityName(SINGLE_INSTANCE_ACTIVITY),
192                 mAmWmState.getAmState().getTopActivityName(0));
193 
194         // Make sure the standard activity and the test activity are not in same task.
195         assertNotEquals("Activity must be in different task.", firstTaskId, secondTaskId);
196 
197         // Make sure the single instance activity is only member of its task.
198         assertEquals("Single instance activity is only member of its task", 1,
199                 mAmWmState.getAmState().getActivityCountInTask(secondTaskId, null));
200     }
201 
202     /**
203      * This test case tests "single task" activity behavior.
204      * - A first launched standard activity and a second launched single task activity
205      * are in same task.
206      * - Instance of single task activity is only one in its task.
207      */
208     @Test
testLaunchSingleTaskActivity()209     public void testLaunchSingleTaskActivity() {
210         // Launch a standard activity.
211         launchActivity(STANDARD_ACTIVITY);
212 
213         final int taskId = mAmWmState.getAmState().getTaskByActivity(STANDARD_ACTIVITY).getTaskId();
214 
215         // Launch a single task activity
216         launchActivity(SINGLE_TASK_ACTIVITY);
217 
218         // Make sure the single task activity is in focus.
219         mAmWmState.assertFocusedActivity(SINGLE_TASK_ACTIVITY + "must be focused Activity",
220                 SINGLE_TASK_ACTIVITY);
221 
222         // Make sure the stack for the single task activity is front.
223         assertEquals("The stack for the single task activity must be front.",
224                 getActivityName(SINGLE_TASK_ACTIVITY),
225                 mAmWmState.getAmState().getTopActivityName(0));
226 
227         // Make sure the test activity is in same task.
228         assertEquals("Activity must be in same task.", taskId,
229                 mAmWmState.getAmState().getTaskByActivity(SINGLE_TASK_ACTIVITY).getTaskId());
230 
231         // Launch a second standard activity
232         launchActivity(SECOND_STANDARD_ACTIVITY);
233 
234         // Launch a single task activity again.
235         launchActivity(SINGLE_TASK_ACTIVITY);
236         mAmWmState.waitForActivityState(SECOND_STANDARD_ACTIVITY, STATE_DESTROYED);
237 
238         // Make sure the number of instances for single task activity is only one.
239         assertEquals("Instance of single task activity in its task must be only one", 1,
240                 mAmWmState.getAmState().getActivityCountInTask(taskId, SINGLE_TASK_ACTIVITY));
241         // Make sure that instance of standard activity does not exists.
242         assertEquals("Instance of second standard activity must not exist.", 0,
243                 mAmWmState.getAmState().getActivityCountInTask(taskId, SECOND_STANDARD_ACTIVITY));
244 
245     }
246 
247     /**
248      * Tests that the existing task would be brought to top while launching alias activity or
249      * real activity without creating new activity instances, tasks, or stacks.
250      */
251     @Test
testLaunchAliasActivity()252     public void testLaunchAliasActivity() {
253         // Launch alias activity.
254         getLaunchActivityBuilder().setUseInstrumentation().setTargetActivity(ALIAS_TEST_ACTIVITY)
255                 .setIntentFlags(FLAG_ACTIVITY_NEW_TASK).execute();
256         final int stacks = mAmWmState.getAmState().getStackCounts();
257         final int taskId =
258                 mAmWmState.getAmState().getTaskByActivity(ALIAS_TEST_ACTIVITY).getTaskId();
259 
260         // Return to home and launch the alias activity again.
261         launchHomeActivity();
262         getLaunchActivityBuilder().setUseInstrumentation().setTargetActivity(ALIAS_TEST_ACTIVITY)
263                 .setIntentFlags(FLAG_ACTIVITY_NEW_TASK).execute();
264         assertEquals("Instance of the activity in its task must be only one", 1,
265                 mAmWmState.getAmState().getActivityCountInTask(taskId, ALIAS_TEST_ACTIVITY));
266         assertEquals("Stacks counts should not be increased.", stacks,
267                 mAmWmState.getAmState().getStackCounts());
268 
269         // Return to home and launch the real activity.
270         launchHomeActivity();
271         getLaunchActivityBuilder().setUseInstrumentation().setTargetActivity(TEST_ACTIVITY)
272                 .setIntentFlags(FLAG_ACTIVITY_NEW_TASK).execute();
273         assertEquals("Instance of the activity in its task must be only one", 1,
274                 mAmWmState.getAmState().getActivityCountInTask(taskId, ALIAS_TEST_ACTIVITY));
275         assertEquals("Stacks counts should not be increased.", stacks,
276                 mAmWmState.getAmState().getStackCounts());
277     }
278 
279     /**
280      * This test case tests behavior of activities launched with FLAG_ACTIVITY_NEW_TASK
281      * and FLAG_ACTIVITY_CLEAR_TASK.
282      * A first launched activity is finished, then a second activity is created if the
283      * second activity is launched with FLAG_ACTIVITY_NEW_TASK and FLAG_ACTIVITY_CLEAR_TASK.
284      */
285     @Test
testLaunchActivityWithFlagNewTaskAndClearTask()286     public void testLaunchActivityWithFlagNewTaskAndClearTask() {
287         // Launch a standard activity with FLAG_ACTIVITY_NEW_TASK.
288         getLaunchActivityBuilder()
289                 .setTargetActivity(STANDARD_ACTIVITY)
290                 .setIntentFlags(FLAG_ACTIVITY_NEW_TASK)
291                 .execute();
292 
293         final int taskId = mAmWmState.getAmState().getTaskByActivity(STANDARD_ACTIVITY).getTaskId();
294 
295         // Launch Activity with FLAG_ACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TASK.
296         getLaunchActivityBuilder()
297                 .setTargetActivity(STANDARD_ACTIVITY)
298                 .setLaunchingActivity(TEST_LAUNCHING_ACTIVITY)
299                 .setIntentFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK)
300                 .execute();
301 
302         mAmWmState.waitForActivityState(STANDARD_ACTIVITY, STATE_DESTROYED);
303 
304         // Make sure the number of instances for standard activity is one
305         // because previous standard activity to be finished due to FLAG_ACTIVITY_CLEAR_TASK.
306         assertEquals("Instance of activity must be one", 1,
307                 mAmWmState.getAmState().getActivityCountInTask(taskId, STANDARD_ACTIVITY));
308 
309         // Make sure the stack for the standard activity is front.
310         assertEquals("The stack for the standard activity must be front.",
311                 getActivityName(STANDARD_ACTIVITY),
312                 mAmWmState.getAmState().getTopActivityName(0));
313     }
314 
315     /**
316      * This test case tests behavior of activity launched with FLAG_ACTIVITY_CLEAR_TOP.
317      * A top activity is finished when an activity is launched with FLAG_ACTIVITY_CLEAR_TOP.
318      */
319     @Test
testLaunchActivityWithFlagClearTop()320     public void testLaunchActivityWithFlagClearTop() {
321         // Launch a standard activity
322         getLaunchActivityBuilder()
323                 .setTargetActivity(STANDARD_ACTIVITY)
324                 .execute();
325 
326         final int taskId = mAmWmState.getAmState().getTaskByActivity(STANDARD_ACTIVITY).getTaskId();
327 
328         // Launch a second standard activity
329         getLaunchActivityBuilder()
330                 .setTargetActivity(SECOND_STANDARD_ACTIVITY)
331                 .setLaunchingActivity(TEST_LAUNCHING_ACTIVITY)
332                 .execute();
333 
334         // Launch a standard activity again with CLEAR_TOP_FLAG
335         getLaunchActivityBuilder()
336                 .setTargetActivity(STANDARD_ACTIVITY)
337                 .setLaunchingActivity(TEST_LAUNCHING_ACTIVITY)
338                 .setIntentFlags(FLAG_ACTIVITY_CLEAR_TOP)
339                 .execute();
340 
341         mAmWmState.waitForActivityState(STANDARD_ACTIVITY, STATE_RESUMED);
342 
343         // Make sure that the standard activity is in focus.
344         mAmWmState.assertFocusedActivity(STANDARD_ACTIVITY + "must be focused Activity",
345                 STANDARD_ACTIVITY);
346 
347         // Make sure the stack for the standard activity is front.
348         assertEquals("The stack for the standard activity must be front.",
349                 getActivityName(STANDARD_ACTIVITY),
350                 mAmWmState.getAmState().getTopActivityName(0));
351 
352         // Make sure the activity is not in same task.
353         assertEquals("Activity must be in same task.", taskId,
354                 mAmWmState.getAmState().getTaskByActivity(STANDARD_ACTIVITY).getTaskId());
355         // Make sure the second standard activity is finished.
356         final String waitFinishMsg = "Instance of second standard activity must not exist";
357         mAmWmState.waitForWithAmState((amState) ->
358             0 == amState.getActivityCountInTask(taskId, SECOND_STANDARD_ACTIVITY),
359             waitFinishMsg);
360         assertEquals(waitFinishMsg, 0,
361             mAmWmState.getAmState().getActivityCountInTask(taskId, SECOND_STANDARD_ACTIVITY));
362     }
363 
364     @Test
testLaunchActivityWithFlagPreviousIsTop()365     public void testLaunchActivityWithFlagPreviousIsTop() {
366         // Launch a standard activity
367         getLaunchActivityBuilder()
368                 .setTargetActivity(SINGLE_TOP_ACTIVITY)
369                 .execute();
370 
371         final int taskId = mAmWmState.getAmState().getTaskByActivity(
372                 SINGLE_TOP_ACTIVITY).getTaskId();
373 
374         // Launch a standard activity again with PREVIOUS_IS_TOP
375         getLaunchActivityBuilder()
376                 .setTargetActivity(SINGLE_TOP_ACTIVITY)
377                 .setLaunchingActivity(LAUNCHING_AND_FINISH_ACTIVITY)
378                 .setIntentFlags(FLAG_ACTIVITY_PREVIOUS_IS_TOP)
379                 .execute();
380 
381         assertEquals("Instance of activity must be one", 1,
382                 mAmWmState.getAmState().getActivityCountInTask(taskId, SINGLE_TOP_ACTIVITY));
383     }
384 
385     /**
386      * This test case tests behavior of activity launched with FLAG_ACTIVITY_SINGLE_TOP.
387      * A single top activity must not be launched if it is already running at the top
388      * of the history stack.
389      */
390     @Test
testLaunchActivityWithFlagSingleTop()391     public void testLaunchActivityWithFlagSingleTop() {
392         // Launch a standard activity
393         getLaunchActivityBuilder()
394                 .setTargetActivity(STANDARD_ACTIVITY)
395                 .execute();
396 
397         final int taskId = mAmWmState.getAmState().getTaskByActivity(STANDARD_ACTIVITY).getTaskId();
398 
399         // Launch a standard activity with SINGLE_TOP flag.
400         // This standard activity launches a standard activity with single top flag.
401         getLaunchActivityBuilder()
402                 .setTargetActivity(STANDARD_SINGLE_TOP_ACTIVITY)
403                 .setLaunchingActivity(TEST_LAUNCHING_ACTIVITY)
404                 .setIntentFlags(FLAG_ACTIVITY_SINGLE_TOP)
405                 .execute();
406 
407         mAmWmState.waitForActivityState(STANDARD_SINGLE_TOP_ACTIVITY, STATE_RESUMED);
408 
409         // Make sure that a new instance is not created if it is already running at the top
410         // of the history stack.
411         assertEquals("Multiple single top activities must not be created.", 1,
412                 mAmWmState.getAmState()
413                         .getActivityCountInTask(taskId, STANDARD_SINGLE_TOP_ACTIVITY));
414 
415 
416         // Make sure that activity is in focus.
417         mAmWmState.assertFocusedActivity(STANDARD_SINGLE_TOP_ACTIVITY + "must be focused Activity",
418                 STANDARD_SINGLE_TOP_ACTIVITY);
419         // Make sure the stack for the single top activity is front.
420         assertEquals("The stack for the single top activity must be front.",
421                 getActivityName(STANDARD_SINGLE_TOP_ACTIVITY),
422                 mAmWmState.getAmState().getTopActivityName(0));
423 
424         // Make sure the standard activity and the single top activity are in same task.
425         assertEquals("Activity must be in same task.", taskId,
426                 mAmWmState.getAmState().getTaskByActivity(STANDARD_SINGLE_TOP_ACTIVITY)
427                         .getTaskId());
428     }
429 
430     /**
431      * This test case tests behavior of activity launched with FLAG_ACTIVITY_MULTIPLE_TASK
432      * and FLAG_ACTIVITY_NEW_TASK.
433      * Second launched activity which is launched with FLAG_ACTIVITY_MULTIPLE_TASK and
434      * FLAG_ACTIVITY_NEW_TASK is created in new task/stack. So, a first launched activity
435      * and a second launched activity are in different task/stack.
436      */
437     @Test
testActivityWithFlagMultipleTaskAndNewTask()438     public void testActivityWithFlagMultipleTaskAndNewTask() {
439         // Launch a standard activity
440         getLaunchActivityBuilder()
441                 .setTargetActivity(STANDARD_ACTIVITY)
442                 .setIntentFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_MULTIPLE_TASK)
443                 .execute();
444 
445         final int taskId = mAmWmState.getAmState().getTaskByActivity(STANDARD_ACTIVITY).getTaskId();
446 
447         // Launch a standard activity with FLAG_ACTIVITY_MULTIPLE_TASK|FLAG_ACTIVITY_NEW_TASK
448         getLaunchActivityBuilder()
449                 .setTargetActivity(STANDARD_ACTIVITY)
450                 .setLaunchingActivity(TEST_LAUNCHING_ACTIVITY)
451                 .setIntentFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_MULTIPLE_TASK)
452                 .execute();
453 
454         // Make sure the stack for the standard activity is front.
455         assertEquals("The stack for the standard activity must be front.",
456                 getActivityName(STANDARD_ACTIVITY),
457                 mAmWmState.getAmState().getTopActivityName(0));
458         // Make sure the first standard activity and second standard activity are not in same task.
459         assertNotEquals("Activity must not be in same task.", taskId,
460                 mAmWmState.getAmState().getTaskByActivity(STANDARD_ACTIVITY).getTaskId());
461     }
462 
463     // Test activity
464     public static class StandardActivity extends Activity {
465     }
466 
467     // Test activity
468     public static class SecondStandardActivity extends Activity {
469     }
470 
471     // Test activity
472     public static class StandardWithSingleTopActivity extends Activity {
473 
474         @Override
onCreate(Bundle savedInstanceState)475         protected void onCreate(Bundle savedInstanceState) {
476             super.onCreate(savedInstanceState);
477             final Intent intent = new Intent().setComponent(
478                     new ComponentName(this /* context */, getClass()));
479             intent.addFlags(FLAG_ACTIVITY_SINGLE_TOP);
480             startActivity(intent);
481         }
482     }
483 
484     // Test activity
485     public static class SingleTopActivity extends Activity {
486     }
487 
488     // Test activity
489     public static class SingleTaskActivity extends Activity {
490     }
491 
492     // Test activity
493     public static class SingleInstanceActivity extends Activity {
494     }
495 
496     // Launching activity
497     public static class TestLaunchingActivity extends Activity {
498         @Override
onCreate(Bundle savedInstanceState)499         protected void onCreate(Bundle savedInstanceState) {
500             super.onCreate(savedInstanceState);
501 
502             final Intent intent = getIntent();
503             if (intent != null) {
504                 ActivityLauncher.launchActivityFromExtras(this, intent.getExtras());
505             }
506         }
507 
508         @Override
onNewIntent(Intent intent)509         protected void onNewIntent(Intent intent) {
510             super.onNewIntent(intent);
511             ActivityLauncher.launchActivityFromExtras(this, intent.getExtras());
512         }
513     }
514 
515     public static class LaunchingAndFinishActivity extends TestLaunchingActivity {
516         @Override
onCreate(Bundle savedInstanceState)517         protected void onCreate(Bundle savedInstanceState) {
518             super.onCreate(savedInstanceState);
519             finish();
520         }
521     }
522 }
523