Android: How do I avoid starting activity which is already in stack?

匿名 (未验证) 提交于 2019-12-03 02:44:02

问题:

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?

回答1:

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"



回答2:

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.



回答3:

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); 


回答4:

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 } 


回答5:

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(); 


回答6:

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) 


回答7:

You may consider using android:launchMode="singleTop" instead of android:launchMode="singleInstance" Good article about the differences



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!