Intent.FLAG_ACTIVITY_NEW_TASK is doing What we think it should do ?


#1

Looks like every tutorial that we have got out there on the web mentions that FLAG_ACTIVITY_NEW_TASK starts a new task if the activity we are starting is not currently running in the task.But it seems that using FLAG_ACTIVITY_NEW_TASK doesn’t Creates a new task always, it is only creating a new task if there is no task available for the activity we need to run like when we start an activity from a BroadCastReceiver using the context inside onReceive() .

According to the all the tutorials on the web,

Suppose we have got following activities in our backStack-

A->B->C

Now If We want to start a new Activity D, then it should start in a New Task, but this doesn’t seems to happens and the activity D is Started in the Same task and we have out final backstack

A->B->C->D

AnyOne Who Can Clarify?

I know setting taskAffinity will force to create a new task but this brings another problem:

Try Yourself:

Suppose we launch two Activity:

A-B

Then again we launch one other Activity with android:taskAffinity**,So now we have got**

A-B | C
A-B (on the same task)
C (on other task)

Now Again We start A-B from C ,So now our BackStack will Look like:

A-B|C-A-B
A-B(on the same task)
C-A-B(on other task)

Now, the problem is If We will Again try to start C from B (from task C-A-B), nothing happens and C will not get launch (I din’t know why?)
Here’s a gif showing the problem…


#2

Without code, it is difficult to comment on what your code does.

I know setting taskAffinity will force to create a new task

No, it just sets the task affinity. Whether a task is created depends on whether that task already exists or not at the time you start the activity.

Now, the problem is If We will Again try to start C from B (from task C-A-B), nothing happens and C will not get launch (I din’t know why?)

Again, without code, it is difficult to comment.

Tasks are one of the most arcane areas of Android UI development, so I’m not surprised that you are encountering problems. Personally, outside of very specific scenarios, I try to avoid task management entirely.

I am sorry that I cannot provide much help as it stands. If you want help with what your code is doing, I would need to be able to see that code.


#3

@mmurphy

Tasks are one of the most arcane areas of Android UI development, so I’m not surprised that you are encountering problems. Personally, outside of very specific scenarios, I try to avoid task management entirely.

I agree with you, it is one of the most confusing thing i have ever encountered with.

For past 4 days i’m just bashing my head into the walls, every time it looks like now i understand how tasks are working one more problem arises and i remain stuck there.Please look at the source code and try to help me with task management.


#4

Your code seems focused on the second scenario from your original question. I am not completely certain what your overall business rules are for what should be going on with your activities outside of these experiments. So, here are two patterns that work:

  • If you want C to always be in a new task, remove its taskAffinity and start it with Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_MULTIPLE_TASK. B will always launch C in a new task, though this will add new tasks for each such launch (since the decision of whether to launch C in a new task is hard-coded in your app).
  • If you want C, and activities launched by C, to be in a separate task, use taskAffinity, but then only start C in a new task the first time. Second and subsequent times, either use FLAG_ACTIVITY_REORDER_TO_FRONT to bring the existing C instance to the foreground, or use no flags to create a new C instance on this other task. This will require you to track some state, to know whether C should be started with FLAG_ACTIVITY_NEW_TASK or not.
                Intent intent= new Intent(SecondActivity.this,ThirdActivity.class);

                if (launchedAlready) {
                    // use intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); if you want to reuse the existing C instance
                }
                else {
                    launchedAlready = true;
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                }

                startActivity(intent);

For finer-grained control over the sequence of events, have only one activity, and use fragments to represent the different screens. This is Google’s long-term direction with Jetpack, as seen with things like the Navigation component.


#5

This seems a much better way than multiple activities…