【问题标题】:How to bring an activity to foreground (top of stack)?如何将活动带到前台(堆栈顶部)?
【发布时间】:2010-02-09 20:18:22
【问题描述】:

在 Android 中,我定义了一个活动 ExampleActivity。

当我的应用程序启动时,创建了这个 A-Activity 的一个实例,比如说它是A。 当用户单击A 中的按钮时,创建了另一个 B-Activity 实例 B。现在任务堆栈是 B-A,顶部是 B。然后,用户单击 B 上的按钮,即 C-Activity 的另一个实例,并创建了 C。现在任务栈是 C-B-A,顶部是 C。

现在,当用户单击 C 上的按钮时,我希望应用程序将 A 带到前台,即使 A 位于任务堆栈的顶部,A-C-B。

如何编写代码来实现它?

【问题讨论】:

    标签: android android-intent android-activity


    【解决方案1】:

    你可以试试这个FLAG_ACTIVITY_REORDER_TO_FRONT(文档描述的正是你想要的)

    【讨论】:

    • 我觉得应该是FLAG_ACTIVITY_SINGLE_TOP
    • @user942821 FLAG_ACTIVITY_SINGLE_TOP 在这里无济于事。当 ActivityC 在栈顶并调用 startActivity() 来启动 ActivityA 时,即使您设置了 FLAG_ACTIVITY_SINGLE_TOP,它仍然会创建 ActivityA 的新实例FLAG_ACTIVITY_SINGLE_TOP 仅在如果您尝试启动已经在堆栈顶部的活动时阻止创建新实例。在这种情况下,ActivityA 不在栈顶,因此 Android 会创建一个新实例。
    • 太棒了!使用(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP) 清除给定Activity 之后的所有历史记录。
    • FLAG_ACTIVITY_REORDER_TO_FRONT 如果您还指定了 FLAG_ACTIVITY_CLEAR_TOP,则将被忽略。检查文档。
    • intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP);如果您想将您的活动与用户会话放在前面,如果它已经在后台但不在前面,这将正常工作。
    【解决方案2】:

    我发现最好的方法是使用与 Android 主屏幕相同的意图 - 应用启动器。

    例如:

    Intent i = new Intent(this, MyMainActivity.class);
    i.setAction(Intent.ACTION_MAIN);
    i.addCategory(Intent.CATEGORY_LAUNCHER);
    startActivity(i);
    

    这样,我的包中用户最近使用的任何活动都会再次回到前面。我发现这在使用我的服务的 PendingIntent 让用户回到我的应用程序时很有用。

    【讨论】:

    • 非常感谢这段代码。我浪费了几个小时试图让它正常工作。
    • 或者没有 ComponentName 和 setComponent,但是有 new Intent(this, MyMainActivity.class)
    • 很奇怪,因为这是唯一对我有用的东西;设置标志不起作用,总是重新创建活动。
    • 当我阅读这个答案和 cmets 时,很明显我们有一个误解。最初的问题是询问如何在任务堆栈中重新排列Activity。 OP 明确表示他想将ActivityA 从堆栈底部移动到堆栈顶部(即:他希望将 ActivityA 重新排序到任务堆栈的前面)。这个答案不会那样做。此答案是对“如何将我的应用程序(任务堆栈)从后台带到前台?”问题的答案,这与 OP 的原始问题完全不同。
    • 另外投票按钮显示“这个答案很有帮助”而不是“这个答案对操作有帮助” - 他/她已经对这种情况有“接受标记”。显然我不知道什么对 op 有帮助,恕我直言,根据我对 op 有帮助的猜测而否决的答案是不正确的。
    【解决方案3】:

    这是一个代码示例,说明如何做到这一点:

    Intent intent = getIntent(getApplicationContext(), A.class)
    

    这将确保您在堆栈中只有一个活动实例。

    private static Intent getIntent(Context context, Class<?> cls) {
        Intent intent = new Intent(context, cls);
        intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
        return intent;
    }
    

    【讨论】:

      【解决方案4】:

      FLAG_ACTIVITY_REORDER_TO_FRONT: 如果在传递给 Context.startActivity() 的 Intent 中设置,则此标志将导致已启动的 Activity 被带到其任务历史堆栈的前面(如果它已经在运行)。

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

      【讨论】:

        【解决方案5】:

        我认为Intent 标志的组合应该可以解决问题。特别是Intent.FLAG_ACTIVITY_CLEAR_TOPIntent.FLAG_ACTIVITY_NEW_TASK

        在调用 startActvity 之前将这些标志添加到您的意图中。

        【讨论】:

          【解决方案6】:

          i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

          注意你的 homeactivity 启动模式应该是 single_task

          【讨论】:

            【解决方案7】:

            总的来说,我认为不推荐这种活动管理方法。在 The Stack 中重新激活两个 Steps 中的活动的问题是该活动可能已被终止。我的建议是记住您的活动状态并使用startActivity () 启动它们

            我确定你已经看过这个页面,但 your convenience this link

            【讨论】:

              【解决方案8】:

              如果您想在单击通知时将活动置于堆栈顶部,则可能需要执行以下操作以使 FLAG_ACTIVITY_REORDER_TO_FRONT 工作:

              我的解决方案是制作一个广播接收器来监听通知触发的广播动作。所以基本上:

              1. 通知触发广播操作,其中包含要启动的活动名称。

              2. 广播接收器在点击通知时捕捉到这一点,然后使用 FLAG_ACTIVITY_REORDER_TO_FRONT 标志创建启动该活动的意图

              3. 活动被带到活动堆栈的顶部,没有重复。

              【讨论】:

                【解决方案9】:

                如果您使用“Google Cloud Message”接收带有“PendingIntent”类的推送通知,以下代码仅在操作栏中显示通知。

                点击通知不会创建活动,最后一个活动活动被恢复,保持当前状态没有问题。

                Intent notificationIntent = new Intent(this, ActBase.class); **notificationIntent.setAction(Intent.ACTION_MAIN); notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);** PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

                NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_launcher) .setContentTitle("Localtaxi") .setVibrate(vibrate) .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)) .setAutoCancel(true) .setOnlyAlertOnce(true) .setContentText(msg);

                mBuilder.setContentIntent(contentIntent);

                NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

                mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());

                Ciao!

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2012-08-04
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-01-28
                  • 1970-01-01
                  相关资源
                  最近更新 更多