繁体   English   中英

如果活动正在运行或者使用backpress创建新活动,请将活动放在前面

[英]Bring activity front if it is running or create new one with backpress

让我详细解释一下; 我有通知,此通知会打开两个案例的B activity

案例:

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

情况1

我点击通知,它用case-1打开B activity 当我press back我想要去A activity并杀死B activity 我不再需要B activity了。 一切都很简单,不用flags 当我在B activity并从这里按两次后,它会进入A activity ,然后关闭app 我的麻烦在于,如果我从手机的导航按钮打开app (不记得这个按钮的名称)应用程序是从B activity打开的。 那不是我的预期。 我想打开A activity 不想再看B activity了。

案例2

我点击通知,它用case-2打开B activity 。当我press back我想把A activity带到前面,而不创建任何新的东西。 如果我按回B activity ,两次并关闭应用程序,然后再次从手机的导航按钮重新打开应用程序,想要从A activity打开应用程序。

那么我怎样才能正确地做到这一点,我试图使用flags (我已经阅读过文档)但是无法正常工作。 什么flags ,当我打开我应该使用B activityonBackPress的方法B activityA activity ,我想

这应该可以通过添加来实现

android:launchMode="singleTask"

对于Manifest中的A活动,那么你可以在B活动onBackPressed上打开一个活动,你将在堆栈中只有一次A.

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

试试这个

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

试试这个

android:launchMode="singleTask" in android manifest file

您可以通过添加FLAG_ACTIVITY_REORDER_TO_FRONT来实现此目的

    Intent i = new Intent(context, Activity.class);
    i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    startActivity(i);

你可以试试这个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传递给(现在开启) top)旧活动作为新的意图。

在此输入图像描述

把它放在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:

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

如何解决案例2:

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

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

      android:noHistory="true"

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM