如果活动正在运行,则将其置于前台;否则,使用后退键创建一个新的活动。

8

让我详细解释一下;我有一个通知,这个通知可以打开B activity,有两种情况。

情况:

  1. 如果应用关闭了。(不在后台运行)
  2. 如果应用已打开。(在后台或前台)

情况1

我点击通知并打开B activity,出现case-1。当我按返回键时,我希望回到A activity并结束B activity。我不再需要B activity。在这之后,没有使用flags,一切都很简单。当我在B activity中按两次返回键时,它会先回到A activity,然后关闭app。我的问题是,如果我从手机的导航按钮打开app(记不起这个按钮的名字)应用程序从B activity打开。这不是我想要的。我想打开A activity。不再想看到B activity

情况2

我点击通知并打开B activity,出现case-2。当我按返回键时,我希望将A activity置于前台,不创建任何新内容。如果我在B activity上按两次返回键,关闭应用程序,然后再从手机的导航按钮重新打开应用程序,希望从A activity打开应用程序。

所以我该如何正确地做这个?我尝试使用flags(我已经阅读了文档),但无法工作。当我打开B activityonBackPressed方法时,我要使用哪些flags才能像我想的那样转到A activity


使用Fragment能帮助找到解决方案吗? - JJ86
7个回答

4
这可以通过添加 <\/p> 来实现。
android:launchMode="singleTask"

如果你在Manifest文件中给A activity设置了launchMode="singleTask",那么当你从B activity的onBackPressed方法中打开A activity时,A activity就只会在栈中存在一次。

如果以上方法不适用于你,你可以创建一个继承自Activity的抽象类,并在其中处理栈的相关操作,然后让A和B都继承这个新类。


3

试一试

 Intent intent = new Intent(context, YourActivity.class);
 intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
 startActivity(intent);

2

试试这个

android:launchMode="singleTask" in android manifest file

1
感谢您提供这段代码片段,它可能会提供一些有限的、即时的帮助。通过展示为什么这是一个好的解决方案,适当的解释将极大地提高其长期价值,并使其对未来具有类似问题的读者更有用。请编辑您的答案,添加一些解释,包括您所做的假设。 - Toby Speight

2
你可以通过添加FLAG_ACTIVITY_REORDER_TO_FRONT来实现这一点。
    Intent i = new Intent(context, Activity.class);
    i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    startActivity(i);

2
您可以尝试使用isTaskRoot()函数,它会返回B是否为根。如果是真的,就启动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作为新Intent传递给(现在处于顶部的)旧活动。

enter image description here


CLEAR_TOP标志将调用Activity的onCreate方法并创建新实例。因此,你的答案是不正确的。 - Mahdi
@kenji 感谢您指出这一点,如果您的活动在B活动之后,则会恢复活动而不是调用Activity的onCreate方法。 - Amjad Khan
在第二个活动的onCreate方法上设置断点,自行检查。尽管该活动已经存在于堆栈中,但它仍会创建一个新的实例并调用OnCreate方法。 - Mahdi
如果从B活动进行返回按下返回按钮以进入A活动,此时A活动将被重新恢复并调用,而B活动将会被结束。 - Amjad Khan

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();将导致打开ActivityA后,ActivityB将关闭。

如何解决案例2:

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


1
如果这是Activity B唯一的实例,您可以为Activity B在清单文件中添加noHistory标志。
      android:noHistory="true"

这将阻止将Activity B添加到返回栈中,也可以通过在调用Activity B时使用Intent Flag FLAG_ACTIVITY_NO_HISTORY来动态实现。
至于当Activity B被杀死时启动Activity A,@Quentin Menini的答案建议在清单文件中设置单个任务活动,如果您只希望通过这种方式访问Activity A,或者使用@Naimish Vinchhi建议的Intent Flag Intent.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所有可能的清单活动选项的链接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接