I read the android developer guide and some articles in internet, I'm still confusing about the singleTask
launchmode
. Lets take an example:
User launch the App1, android starts a new task. Assume the App1 creates activities in follow order:
ActivityA -> ActivityB -> ActivityC
That's how task1 looks like.
Then user click the home buttom and choose to launch App2, so task1 goes in background and android start a new task: task2, user does something:
ActivityD -> ActivityE
now lets say ActivityE
try to start ActivityB
, and ActivityB
has the launchmode singleTask
.
What I understand is that task1 comes to frontend again and task2 goes to background. And task1 looks now like this:
ActivityA -> ActivityB
Which means:
The ActivityC
will be removed from task1 and ActivityB becomes to the top Activity.
If user now click on "Back" button, he will come to ActivityA
of task1 instead of back to ActivityE
of task2
Am I right?
Thanks
"singleTop" If an instance of the activity already exists at the top of the current task, the system routes the intent to that instance through a call to its onNewIntent() method, rather than creating a new instance of the activity.
This is the default launch mode of activity (If not specified). It launches a new instance of an activity in the task from which it was launched. Numerous instances of the activity can be generated, and multiple instances of the activity can be assigned to the same or separate tasks.
SingleTask. If the tasks don't have an existing instance of the Activity , then a new instance is created that is similar to singleTop . If the tasks have an existing instance of the Activity and it's at the top of the Activity , then the system will pass the intent data to the onNewIntent function.
single Top:- Same as singleTask, except that the no activities instance can be pushed into the same task of the single Top. Accordingly, the activity with launch mode is always in a single activity instance task.
The ActivityC will be removed from task1 and ActivityB becomes the top Activity.
Yes, you are Right...
ActivityC will be removed
from i.e. the onDestroy
method of the ActivityC will be called. Hence when the user launches Task 1 again, the ActivityB is shown rather than ActivityC.
Have created 2 Tasks (Projects) and uploaded the same @ SendSpace. Try it out...
If you look at androids documentation it says
" A "singleTask" activity allows other activities to be part of its task. It's always at the root of its task, but other activities (necessarily "standard" and "singleTop" activities) can be launched into that task."
This means that when you click the home button all the activities above the single-task activity (which in your case is ActivityB) are removed from the stack.
In the sample, the app's I had given you earlier if you just run the project "AndroidTest" and click the home button in the logs you can see that the 2nd Activity is put on Pause, and when you launch it again from the "Recent App's" list the 2nd Activity is Destroyed.
In a scenario where the Activity's above the Single Instance activities (ActivityB) are not removed from the Back Stack, and another application request this Activity (ActivityB) it may not be shown and the intent may be dropped. But this has extremely fewer chances of happening because the user will have to press the Home button and but the current Task\App in the BackStack before he could navigate to another Task\App.
Hence the warning
The other modes — singleTask and singleInstance — are not appropriate for most applications, since they result in an interaction model that is likely to be unfamiliar to users and is very different from most other applications.
I hope this solves your doubts.
You sound right.
Why don't you test it.
There is also this app that can help explain launch mode:
https://play.google.com/store/apps/details?id=com.novoda.demos.activitylaunchmode
Sources are at https://github.com/gnorsilva/Activities-LaunchMode-demo
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With