按下"后退"按钮时如何终止活动?

Sha*_*aun 31 android kill button back android-activity

我有一个活动,当它启动时,它从互联网加载图像.为了节省内存,当按下后退按钮留下Activity时,我希望活动转储所有数据,即删除其中的所有字符串和图像.我认为最好的方法是杀死活动.

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

public void onPause() {
    this.finish();
}
public void onStop() {
    finish();
}
Run Code Online (Sandbox Code Playgroud)

我尝试过多种变体,但似乎都没有.有任何想法吗?

Dhi*_*dya 71

简单覆盖onBackPressed方法:

    @Override
    public void onBackPressed() {
            super.onBackPressed();
            this.finish();
    }
Run Code Online (Sandbox Code Playgroud)


ing*_*abh 40

将此添加到您的活动中

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

  • 此外,我在这里看到了很多关于KEYCODE_BACK的黑客攻击.如果用户按下HOME按钮怎么办?如果用户按住HOME按钮选择其他应用程序怎么办?如果应用程序因打电话而切换怎么办?还是通知?在大多数情况下,如果您正在检查KEYCODE_BACK,那么您做错了. (13认同)
  • 当然但是按下后退按钮时活动被杀死是不确定的,所以杀掉完成是重要的,那就是问题但是因为释放内存它会自动完成OS的操作 (3认同)
  • 重点是什么?按下返回按钮将自动进入活动堆栈。“ finish()”只是确保您不能返回。(也就是说,这个问题含糊其词。) (2认同)
  • 绝对不.如果活动不在前面,则可以由OS回收.完成与否. (2认同)

小智 14

public boolean onKeyDown(int keycode, KeyEvent event) {
    if (keycode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
    }
    return super.onKeyDown(keycode, event);
}
Run Code Online (Sandbox Code Playgroud)

我的应用程序以上面的代码关闭


Ama*_*lam 7

好吧,如果你研究的应用程序生命周期的运作,该结构在这里,那么你会来知道,onPause()当其他活动获得焦点被调用,onStop()当活动不再可见被调用.

根据我所学到的,你finish()只能从活跃和/或有焦点的活动中打电话.如果您使用finish()onPause()方法调用,则表示您在活动不再处于活动状态时调用它.因此抛出异常.

从那时开始调用时finish(),onStop()活动将被发送到后台,因此将不再可见,然后是此异常.

当你按下back按钮时,会onStop()被调用.

最有可能的是,Android会自动为您提供您当前想要做的事情.


Ebo*_*ike 7

首先,finish()不会破坏您的进程并释放内存.它只是从活动堆栈中删除活动.你需要杀死这个过程,这个问题在一堆问题中得到了回答(因为这是多次被问到的).

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

在这里看到有关该主题的一个伟大的写了.

  • 如果活动正在使用大量资源,那么为什么不从应用程序内部杀死它而不是等待GC呢?这是一个必须贯穿的整个过程,因此减慢了手机的速度.良好的内存管理正在尝试在程序本身内管理它.这就是为什么大多数托管编程语言和ide会自动将自清理代码放入程序中的原因,以及它为什么要给出生命周期的原因,以便您可以在应用程序中尽可能地管理内存. (7认同)
  • Shaun 是对的,良好的内存管理正在尽一切努力在程序本身内管理它。 (2认同)