【问题标题】:Bring activity front if it is running or create new one with backpress如果活动正在运行,则将活动置于最前面或使用后压创建新活动
【发布时间】:2018-04-22 16:33:29
【问题描述】:

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

案例:

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

案例一

我点击通知,它会打开带有case-1B activity。当我press back 时,我想去A activity 并杀死B activity。我不再需要B activity。无需使用flags,从这里一切都变得简单。当我在B activity 上并从这里按两次时,它会转到A activity,然后关闭app。我的麻烦是,如果我从手机的导航按钮(不记得此按钮的名称)打开app,应用程序将从B activity 打开。这不是我所期望的。我想打开A activity。不想再看到B activity

案例 2

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

那么我怎样才能正确地做到这一点,我尝试使用flags(我已经阅读过文档)但无法工作。 当我打开B activityB activityonBackPress 方法以按照我的意愿去A activity 时,我应该使用什么flags

【问题讨论】:

  • 使用Fragment 是否有助于找到解决方案?

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


【解决方案1】:

如果这是正在使用的 Activity B 的唯一实例,您可以将标志 noHistory 添加到 Activity B 的清单中

      android:noHistory="true"

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

至于在 Activity B 被杀死时启动 Activity A @Quentin Menini 的答案是,如果这是您希望访问 Activity A 或 Intent Flag Intent 的唯一方式,那么在清单中设置单个任务活动的答案将起作用。 @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 所有可能的清单活动选项的链接

【讨论】:

    【解决方案2】:

    试试这个

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

    【讨论】:

      【解决方案3】:

      只需将这个放在 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(); on ActivityB BackPressed 方法使 ActivityB 在打开 ActivityA 后完成。所以打开ActivtyA后,ActivityB会关闭。

      如何解决案例2:

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

      【讨论】:

        【解决方案4】:

        你可以试试这个 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();
                }
            }
        

        你可以在Notification Click上调用B Activity

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

        如果设置了 FLAG_ACTIVITY_CLEAR_TOP,则正在启动的 Activity 已经在当前任务中运行,那么不会启动该 Activity 的新实例,而是关闭它之上的所有其他 Activity,并且该 Intent 将被传递到(现在在顶部)作为新 Intent 的旧活动。

        【讨论】:

        • CLEAR_TOP 标志将调用 Activity 的 onCreate 并创建新实例。所以你的答案不对
        • @kenji 感谢您指出,如果您的活动落后于 B 活动,它将恢复活动,不会调用活动的 onCreate 方法
        • 通过在 onCreate 第二个活动上放置断点自行检查。尽管堆栈中存在活动,但它会创建一个新的并调用 OnCreate 方法。
        • 如果你从 B 活动中按 Back Press 去 A 活动,此时 A 活动在简历上将调用,B 将完成
        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          试试这个

          android:launchMode="singleTask" in android manifest file
          

          【讨论】:

          • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。一个正确的解释would greatly improve 它的长期价值通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。
          【解决方案7】:

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

          android:launchMode="singleTask"
          

          到 Manifest 中的 A 活动,然后您可以从 B 活动 onBackPressed 打开 A 活动,而 A 在堆栈中只有一次。

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

          【讨论】:

            猜你喜欢
            • 2013-10-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多