Setting launchMode="singleTask" vs setting activity launchMode="singleTop"

AndroidAndroid ActivityAndroid ManifestAndroid Navigation

Android Problem Overview


I have an app that is very hierarchical (activities are similar to League > Team > Position > Player) and so I've made each activity singleTop in order to keep navigation sensible and to prevent duplicate instances.

Now I'm making my second app and I've seen it suggested to declare my application to be singleTask to prevent duplicate instances. Could someone help explain the advantages of each approach?

My new app is just an activity with 3 fragments and then I'll probably add a settings activity and maybe a FAQ.

EDIT: I just realized that singleTask is NOT preventing duplicate instances of my app, as I had thought. Now looking for the right way to handle this...

Android Solutions


Solution 1 - Android

I think your definition of singleTop and singleTask is a little off. SingleTop could produce a duplicate instance. Lets use your example, League > Team > Position > Player. If there is a button in the player screen that will take you to the league screen, it will become League > Team > Position > Player > League.

Whereas singleTask guarantees that only one instance of the activity can exist.

Solution 2 - Android

Android activity launchMode

4 modes...

  1. "standard"
  2. "singleTop"
  3. "singleTask"
  4. "singleInstance"

The default mode is "standard".

The modes fall into two groups. standard and singleTop comes in one side and singleTask and singleInstance comes in another side.

The main difference between standard and singleTop is in standard, every time a new intent for standard activity, a new instance is created. In case of singleTop too, a new instance is created but an instance of the activity is already in top of the stack, it wont create a new instance.

Actually, the issue comes , when we download an application from a server and launch it and open it from there itself. After launching the application, press home button. Then click the all programs and select the icon of the application from home screen. Then another activity will be created in the case of standard, but in singleTop , no new instance will be created.

The "singleTask" and "singleInstance" modes also differ from each other in only one respect:

A "singleTask" activity allows other activities to be part of its task. It's at the root of the activity stack, but other activities (necessarily "standard" and "singleTop" activities) can be launched into the same task.

A "singleInstance" activity, on the other hand, permits no other activities to be part of its task. It's the only activity in the task. If it starts another activity, that activity is assigned to a different task — as if FLAG_ACTIVITY_NEW_TASK was in the intent.

http://smartandroidians.blogspot.in/2010/04/activity-launch-mode-in-android.html

Solution 3 - Android

I found the answer here: http://www.intridea.com/blog/2011/6/16/android-understanding-activity-launchmode

"singleTop":

The difference from 'standard' is, if an instance of activity already exists at the top of the current task and system routes intent to this activity, no new instance will be created because it will fire off an onNewIntent() method instead of creating a new object. Let's take the Twitter-oauth integration as example.

"singleTask":

A new task will always be created and a new instance will be pushed to the task as the root one. However, if any activity instance exists in any tasks, the system routes the intent to that activity instance through the onNewIntent() method call. In this mode, activity instances can be pushed to the same task. And if the user clicks the BACK key from the singleTask activity, the system will return the user to the previous activity.

Solution 4 - Android

From Understanding Activity launch mode:

> standard (default) :- Multiple instances of the activity class can be > instantiated and multiple instances can be added to the same task or > different tasks. This is the common mode for most of the activities. > > > singleTop :- The difference from standard is, if an instance of the > activity already exists at the top of the current task and the system > routes the intent to this activity, no new instance will be created > because it will fire off an onNewIntent() method instead of creating a > new object. > > > singleTask:- A new task will always be created and a new instance will > be pushed to the task as the root. However, if any activity instance > exists in any tasks, the system routes the intent to that activity > instance through the onNewIntent() method call. In this mode, activity > instances can be pushed to the same task. This mode is useful for > activities that act as the entry points. > > singleInstance:- Same as singleTask, except that the no activities > instance can be pushed into the same task of the singleInstance’s. > Accordingly, the activity with launch mode is always in a single > activity instance task. This is a very specialized mode and should > only be used in applications that are implemented entirely as one > activity.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNSouthView Question on Stackoverflow
Solution 1 - AndroidCChiView Answer on Stackoverflow
Solution 2 - AndroidSelvaView Answer on Stackoverflow
Solution 3 - AndroidM.HefnyView Answer on Stackoverflow
Solution 4 - Androidsince k sajiView Answer on Stackoverflow