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

问题描述:

让我们试着解释我的问题: 我得到了一个应用程序和一个服务。 启动应用程序与活动A. 服务发送一个广播,可以让应用程序启动活动B 现在用户开始活动C.Android:我如何避免已经在堆栈中的开始活动?

现在服务要重新开始b活动。但是,我怎么让他知道这项活动仍然在筹备中,或者是否存在这样的意图标志?

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

+0

什么是d到底是什么?它是你写的代码吗?如果是这样,答案很简单,**不**调用'StartActivity(B)'。 – 2012-03-07 08:58:40

+0

对不起,我重写了我的问题:) – 2012-03-07 09:02:24

我认为你需要让你的活动B singleInstance,如果它已经创造你不想再创造,这是launch mode of the activity可以在清单android:launchMode定义,定义如何活动将被实例化

在你的情况下使用

android:launchMode="singleInstance"

+1

工作正常! :)谢谢 – 2012-03-07 09:25:01

+2

但是,如果我将launchMode设置为singleInstance,我将无法正确获取onActivityResult回调。 – DevAndroid 2015-09-04 12:22:38

+1

它解决了我的问题.. – 2015-10-15 05:21:17

您可以使用标记Intent.FLAG_ACTIVITY_NEW_TASK。如果活动已经在运行,它会将其放在前面,而不是创建新的活动。

如果您添加Intent.FLAG_ACTIVITY_CLEAR_TOP与此,那么在此活动后在堆栈中的所有活动将被清除。

+2

这是exaclty我不想发生的事情。如果已经开始活动的活动。它不应该被覆盖。 – 2012-03-07 09:11:26

+1

这不会覆盖该活动。它只会带来已经开始的活动。 – 2012-03-07 09:23:48

+2

Intent.FLAG_ACTIVITY_NEW_TASK不适用于我..这总是开始新的活动.. 请帮我出来 – 2014-08-08 06:08:27

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

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

这在使用侧栏/抽屉时特别有用,并且您不希望在前面打开两次活动。 – dermatthias 2015-12-17 15:54:44

+0

我开始使用Intent.FLAG_ACTIVITY_SINGLE_TOP从一个服务的活动,该活动不会启动,我得到此错误: android.util.AndroidRuntimeException:从活动上下文外调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志。这真的是你想要的吗? – yeahman 2016-03-10 18:36:09

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

我建议您使用Intent.FLAG_ACTIVITY_CLEAR_TOP,因为它会移除所有在您的目标活动之上开始的活动。

如:

Intent intent = new Intent(sourceActivity, Target activity); 

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

startActivity(intent) 

您可以考虑使用的android:launchMode="singleTop"代替android:launchMode="singleInstance" Good article about the differences