Reputation: 8030
Lets try to explain my question: I got an application and a service. The application is started with activity A. The service sends a broadcast that will let the application start Activity B Now the user starts activity C.
Now the service wants to start activity B again. But how do I let him know that the activity is still on the stack, or is there an intent flag for this?
How do I avoid that it will launch activity B because its already in the stack?
Upvotes: 57
Views: 54508
Reputation: 6461
You may consider using android:launchMode="singleTop"
instead of android:launchMode="singleInstance"
Good article about the differences
Upvotes: 4
Reputation: 34170
I would suggest you use Intent.FLAG_ACTIVITY_CLEAR_TOP as it will remove all activities which start on top of your targeted activity.
eg :
Intent intent = new Intent(sourceActivity, Target activity);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent)
Upvotes: -1
Reputation: 37969
Approaches android:launchMode="singleInstance"
and just adding flags to the Intent
do not work for me.
What works is that:
In the code where activity gets started:
Intent intent = new Intent(activity, ActivityThatHasToBeStarted.class);
intent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
startActivity(intent);
In the ActivityThatHasToBeStarted
:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
finish();
return;
}
// Code for this creation
}
Upvotes: 7
Reputation: 1644
If you don't need the second activity anymore, it is good practise to finish it, then you should do this on the second activity after the operation is ended:
startActivity(new Intent(this, FirstActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
finish();
Upvotes: 2
Reputation: 2437
If the activity will be on the top if already started, set the FLAG_ACTIVITY_SINGLE_TOP flag
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
mContext.startActivity(intent);
Upvotes: 11
Reputation: 34291
I think you need to make your activity B singleInstance
that if it's already create you don't want to create again, that is launch mode of the activity can be defined in manifest android:launchMode
that defines how the activity will be instanciated.
in your case use android:launchMode="singleInstance"
Upvotes: 82
Reputation: 4908
You can use flag Intent.FLAG_ACTIVITY_NEW_TASK. If the activity is already running it will bring that to front instead of creating new activity.
If you add Intent.FLAG_ACTIVITY_CLEAR_TOP with this, then all the activities after this activity in the backstack will be cleared.
Upvotes: 31