【问题标题】:How do I kill an Activity when the Back button is pressed?按下后退按钮时如何终止活动?
【发布时间】:2011-06-14 07:20:53
【问题描述】:

我有一个活动,当它启动时,它会从互联网加载一张图片。为了节省内存,当按下后退按钮离开活动时,我希望活动转储所有数据,即删除其中的所有字符串和图像。我认为最好的方法就是终止活动。

好吧,我似乎无法弄清楚按下后退按钮时的回调。所以,我一直在尝试使用onPause() 和onStop() 回调来完成任务,但两种方式都强制关闭我的应用程序。代码如下:

public void onPause() {
    this.finish();
}
public void onStop() {
    finish();
}

我已经尝试了多种变体,但似乎都没有奏效。有任何想法吗?

【问题讨论】:

  • 你到底在找什么?在后面完成当前活动?按钮

标签: android button android-activity kill back


【解决方案1】:

简单覆盖 onBackPressed 方法:

    @Override
    public void onBackPressed() {
            super.onBackPressed();
            this.finish();
    }

【讨论】:

    【解决方案2】:

    将此添加到您的活动中

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
        if ((keyCode == KeyEvent.KEYCODE_BACK))
        {
            finish();
        }
        return super.onKeyDown(keyCode, event);
    }
    

    【讨论】:

    • 有什么意义?按下后退按钮将自动进入活动堆栈。 finish() 只是确保你不能回去。 (也就是说,这个问题确实含糊不清。)
    • 当然,但是在按下后退按钮时不能确定活动是否被杀死,所以杀死完成很重要,这就是问题所在,但由于释放内存是由操作系统自动完成的
    • 绝对不是。如果活动不在前面,它可以被操作系统回收。完成与否。
    • 此外,我在这里看到了很多带有 KEYCODE_BACK 的 hack。如果用户按下 HOME 按钮会怎样?如果用户按住 HOME 按钮选择不同的应用程序怎么办?如果应用程序因为一个电话而切换怎么办?还是通知?在大多数情况下,如果您正在检查 KEYCODE_BACK,那么您做错了。
    • 我知道每个人都来自哪里,但这是我一直在寻找的答案。如果他们想返回活动,我希望他们无论如何都重新加载它,因为信息可能已经在服务器上更改。感谢您对此的帮助。
    【解决方案3】:
    public boolean onKeyDown(int keycode, KeyEvent event) {
        if (keycode == KeyEvent.KEYCODE_BACK) {
            moveTaskToBack(true);
        }
        return super.onKeyDown(keycode, event);
    }
    

    我的应用程序使用上述代码关闭。

    【讨论】:

    • 它的工作,但应用程序总是打开同一个页面,只要应用程序没有被杀死
    • 但想在 Launcher 活动中启动应用
    【解决方案4】:

    首先,finish() 不会破坏您的进程并释放内存。它只是从活动堆栈中删除活动。您需要终止该进程,该进程会在一堆问题中得到回答(因为这已被多次询问)。

    但正确的答案是 - 不要这样做。 Android 操作系统会在需要内存时自动释放内存。通过不释放内存,如果用户回到应用程序,您的应用程序将启动得更快。

    请see here 撰写有关该主题的精彩文章。

    【讨论】:

    • 如果活动正在使用大量资源,那么为什么不从应用程序内部杀死它而不是等待 GC?那是一个必须运行的整个过程,因此会减慢电话速度。良好的内存管理正在尽一切努力在程序本身内对其进行管理。这就是为什么大多数托管编程语言和 ide 会自动将自我清理代码放入程序中,这也是您提供生命周期的原因,以便您可以在应用程序中尽可能地管理内存。
    • Shaun 是对的,良好的内存管理正在尽一切努力在程序本身内进行管理。
    【解决方案5】:

    好吧,如果你研究了应用程序生命周期的结构,here,那么你就会知道onPause() 在另一个活动获得焦点时被调用,onStop() 在另一个活动获得焦点时被调用,onStop() 在活动不再可见。

    据我所知,您只能从处于活动状态和/或具有焦点的活动中调用finish()。如果您从onPause() 方法调用finish(),这意味着您在活动不再处于活动状态时调用它。因此抛出异常。

    当您从onStop() 调用finish() 时,活动被发送到后台,因此将不再可见,然后出现此异常。

    当您按下back 按钮时,会调用onStop()。

    很可能,Android 会自动为您完成您当前想做的事情。

    【讨论】:

      猜你喜欢
      • 2016-12-30
      • 2013-08-08
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多