如果活动正在运行或使用backpress

时间:2017-11-09 15:42:29

标签: java android android-intent android-activity stack

让我详细解释一下; 我收到通知,此通知会在两个案例中打开B activity

案例:

  1. 如果应用已关闭。 (不在后台运行)
  2. 如果应用已打开。 (背景或正面)
  3. 案例-1

    我点击通知,然后用B activity打开case-1。当我press back我想转到A activity并杀死B activity时。我不再需要B activity了。在不使用flags的情况下,一切都很简单。当我在B activity上并从此处按两次后,它会A activity,然后关闭app。我的麻烦在于,如果我从电话的导航按钮打开app(无法记住此按钮的名称)应用程序是从B activity打开的。这不是我的预期。我想打开A activity。不想再看B activity了。

    案例-2

    我点击通知,然后点击B activity case-2。当我press back我希望将A activity带到前面时,不会创建任何新内容。如果我按回B activity,两次并关闭应用,然后再次从手机的导航按钮重新打开应用,则需要从A activity打开应用。

    那么我怎样才能正确地做到这一点,我试图使用flags(我已经阅读过文档)但是无法开始工作。 当我打开flags的{​​{1}} B activity方法onBackPress按我想要的方式B activity时,我应该使用A activity

7 个答案:

答案 0 :(得分:4)

这应该可以通过添加

来实现
android:launchMode="singleTask"

到Manifest中的A活动,然后你就可以从B活动onBackPressed打开一个活动,你只能在堆栈中有一次A.

如果它没有按照你想要的方式工作,你可以创建一个扩展Activity并在静态对象中处理堆栈的抽象类,然后A& B必须扩展这个新类

答案 1 :(得分:3)

试试这个

x

答案 2 :(得分:2)

试试这个

android:launchMode="singleTask" in android manifest file

答案 3 :(得分:2)

您可以通过添加FLAG_ACTIVITY_REORDER_TO_FRONT

来实现此目的
    Intent i = new Intent(context, Activity.class);
    i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    startActivity(i);

答案 4 :(得分:2)

你可以尝试这个isTaskRoot()这将返回B是root

如果是,则启动A

另外,你可以完成B

B活动

@Override
    public void onBackPressed() {
        if (isTaskRoot()) {
            //call A which is not exist
            Intent i =new Intent(B.this,A.class);
            i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(i);
        }else {
            //Finish B if A Already Exixt
            finish();
        }
    }

您可以在通知单击

上调用B活动

如果 A 存在,那么你可以完成B ,否则你可以启动 A

  

如果设置FLAG_ACTIVITY_CLEAR_TOP,正在启动的活动已经在当前任务中运行,那么将不会启动该活动的新实例,而是关闭其上的所有其他活动,并将此Intent传递给(现在在最前面)作为新意图的旧活动。

enter image description here

答案 5 :(得分:2)

将它放在ActivityB onBackPressed上:

Intent i = new Intent(ActivityB.this , ActivityA.calss);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(i);
finish();

如何解决案例1:

ActivityB BackPressed方法上的

finish();使ActivityB在打开ActivityA后完成。因此,在打开ActivtyA后,ActivityB将关闭。

如何解决案例2:

使用这个组合标志,它会做你想要的。它将关闭堆栈中的所有活动,并保持目标活动。如果存在活动实例,它将使用它并调用OnNewInstance,否则将创建新的活动。

答案 6 :(得分:1)

如果这是使用的活动B的唯一实例,则可以将标志noHistory添加到活动B的清单

      android:noHistory="true"

这将停止将活动B添加到后台堆栈,这也可以通过在调用活动B时使用Intent Flag FLAG_ACTIVITY_NO_HISTORY来动态生成。

至于活动A在活动B被杀死时开始活动@Quentin Menini的答案是,如果这是您希望访问活动A或意图标记意图的唯一方式,则在清单中设置单个任务活动将会起作用。 @Naimish Vinchhi建议的FLAG_ACTIVITY_REORDER_TO_FRONT将在这种情况下产生预期效果。

https://developer.android.com/reference/android/content/Intent.html 链接以查看所有可能的Intent标志

https://developer.android.com/guide/topics/manifest/activity-element.html 所有可能的清单活动选项的链接