Android:我如何避免已经在堆栈中的开始活动?

让我们试着解释我的问题:我有一个应用程序和一个服务。 应用程序以活动A开始。服务发送一个广播,让应用程序启动活动B现在用户启动活动C.

现在服务想要再次启动活动B. 但是,我怎么让他知道这个活动还在堆栈中,还是有一个意图的标志呢?

我如何避免它将启动活动B,因为它已经在堆栈中了?

我认为你需要让你的活动B singleInstance ,如果它已经创build你不想再次创build,那就是活动的启动模式可以定义在清单android:launchMode定义如何活动将被实例化

在你的情况使用android:launchMode="singleInstance"

您可以使用标志Intent.FLAG_ACTIVITY_NEW_TASK 。 如果活动已经在运行,它将把它带到前面,而不是创build新的活动。

如果你用这个添加Intent.FLAG_ACTIVITY_CLEAR_TOP ,那么在这个活动之后的所有活动都将被清除。

如果活动将在顶部,如果已经开始,请设置FLAG_ACTIVITY_SINGLE_TOP标志

 intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); mContext.startActivity(intent); 

方法android:launchMode="singleInstance" ,只是添加标志的Intent不为我工作。 有效的是:

在活动开始的代码中:

 Intent intent = new Intent(activity, ActivityThatHasToBeStarted.class); intent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); startActivity(intent); 

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 } 

如果你不再需要第二个活动,那么最好是完成它,然后在操作结束后的第二个活动中这样做:

 startActivity(new Intent(this, FirstActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)); finish(); 

我build议你使用Intent.FLAG_ACTIVITY_CLEAR_TOP ,因为它将删除所有在你的目标活动之上开始的活动。

例如:

 Intent intent = new Intent(sourceActivity, Target activity); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent)