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

时间:2012-03-07 08:55:22

标签: android android-activity

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

现在该服务想再次启动活动B.但是我怎么让他知道活动仍然在堆栈上,或者是否有一个意图标志呢?

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

7 个答案:

答案 0 :(得分:68)

我认为你需要让你的活动B singleInstance,如果它已经创建了你不想再创建,那么launch mode of the activity可以在定义的android:launchMode中定义活动将如何实现

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

答案 1 :(得分:25)

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

如果您使用此添加 Intent.FLAG_ACTIVITY_CLEAR_TOP ,则将清除此功能在Backstack中的所有活动。

答案 2 :(得分:9)

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

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

答案 3 :(得分:5)

方法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
}

答案 4 :(得分:2)

如果您不再需要第二个活动,最好完成它,然后您应该在操作结束后在第二个活动上执行此操作:

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

答案 5 :(得分:2)

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

答案 6 :(得分:-1)

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

例如:

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

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

startActivity(intent)