【问题标题】:what is the right way to clear background activity/activites from stack?从堆栈中清除后台活动/活动的正确方法是什么?
【发布时间】:2012-05-30 23:37:17
【问题描述】:

正如问题标题所说 - 我需要知道“删除”/销毁/完成位于堆栈中间某处且当前处于暂停模式的活动的最佳方法是什么(不是特定实例 - 而是特定的派生类)。

例如:
如果堆栈的当前状态如下所示:

ActivityD   <-- top of the stack, currently forground
ActivityC
ActivityA
ActivityC
ActivityA

“清除”所有 ActivityC 实例的请求将导致堆栈如下所示:

ActivityD  <-- still top of the stack, currently forground.
ActivityA
ActivityA

我不想这样做取决于活动启动模式或意图标志。我知道如何使用它们以及它们的好处。

我目前知道我可以做的是发送广播,所有需要销毁的活动都会收听,并在收到广播时调用 Activity.finish()。
这是可行的,但即使在他们的托管活动暂停时,它也需要注册接收者,而且我不确定从暂停的活动中调用“finish()”方法是否正确。

从恢复的活动中调用 Activity.finish() 方法是否正确?

在OnCreate()方法中注册receiver,并在OnDestroy()中注销它是否正确?

从恢复的活动中处理广播是否正确,并从那时起调用finish()?

是否有“Android 方式”或某些我不知道的 API 可以从堆栈中清除活动?

提前致谢

【问题讨论】:

  • 这是一个非常古老的问题,但我最近也在想。特别是从暂停的活动中调用的“finish()”方法是正确的做法”部分。您的意思是“来自paused 活动的 Activity.finish() 方法吗?”而不是resumed?

标签: android android-activity broadcastreceiver activity-finish activity-stack


【解决方案1】:

制作一个自定义广播接收器并将其注册到可以在您选择的事件上触发的每个活动中。在每个活动的 onReceiveMethod 中(可能被选中)只需调用 finish()。在这种情况下,您的活动将从堆栈中删除。此外,您可以访问此以获得更多帮助: On logout, clear Activity history stack, preventing "back" button from opening logged-in-only Activites

【讨论】:

  • 您阅读我的问题正文了吗?正如我所写 - 我现在正在使用该解决方案。你能告诉我是否出于某种原因使用此解决方案不会导致 Android 固件工程师对以这种方式使用广播接收器感到不满吗?
  • 抱歉。我没有正确阅读你的问题。据我所知,没有这样的方法。但很可能我错了。一件事是,如果您希望一个活动不驻留在堆栈中,只需在没有历史属性的情况下启动它,可以通过代码和 xml 进行设置。
  • 感谢您的回答,我需要我的活动在某些时候保留在堆栈中,因此使用 no history 属性对我来说不是一个选项。如果您想听听,我可以更具体地说明使我需要此要求的情况:我需要从应用程序内部和外部处理 c2dm 推送通知-根据它打开特定屏幕,并在跳转到某些活动时- 从堆栈中清除“MainMenuActivity”旁边的所有活动
【解决方案2】:

我也遇到了同样的问题。我所做的是,我保留了一个静态数组列表,每当我从一个活动转到另一个活动时,在新活动的 onCreate() 方法中,我将当前活动的对象添加到该列表中,如下所示:

SomeClass.addActivity(CurrentActivity.this);

我在每个活动中都添加了上述语句。

addActivity():

public void addActivity(final Activity activity) {
            activityList.add(activity);
        }

当我想清除堆栈时,我调用了:

public boolean clearStack() {
        for (Activity activity : activityList) {
            activity.finish();
        }
        activityList.clear();
        return (activityList.isEmpty());
    }

这样,我清除了我的活动堆栈。

谢谢你:)

【讨论】:

  • 您的解决方案可以工作,但这不是正确的方法。持有对活动的引用是不行的……它很容易导致内存泄漏。无论如何感谢您的帮助
【解决方案3】:
    Intent myintent = new Intent(YourCurrentActivity.this, YourNextActivitys.class);
    myintent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(myintent);
    finish();

我认为这是清除所有以前活动的正确方法...

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-09-19
  • 2012-12-16
  • 2018-12-01
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
相关资源
最近更新 更多