覆盖后退按钮,就像主页按钮一样

问题

按下后退按钮,我希望我的应用程序进入停止状态,而不是被破坏状态。

在Androiddocsit中指出:

...并非所有活动都具有按下BACK时它们被销毁的行为。当用户开始在音乐应用程序中播放音乐然后按BACK时,应用程序将覆盖正常的后退行为,防止播放器活动被破坏,并继续播放音乐,即使其活动不再可见
如何在我自己的应用程序中复制此功能?
我认为必须有三种可能性......

  • 按下后退按钮(如下所示),然后调用主页按钮调用的任何方法。 @覆盖
    public boolean onKeyDown(int keyCode,KeyEvent event){
        if((keyCode == KeyEvent.KEYCODE_BACK)){
            Log.d(this.getClass()。getName(),"后退按钮");
        }
        return super.onKeyDown(keyCode,event);
    }
  • 按下后退按钮,然后按下主页按钮。
  • 按下后退按钮,然后启动主屏幕的活动,有效地将我的应用程序的活动置于停止状态。

**编辑:**我了解服务并且在与此问题相关的应用程序中使用了一个服务。这个问题具体是关于按下后退按钮将Activity置于停止状态而不是销毁状态。


#1 热门回答(324 赞)

大多数时候你需要创建一个Service来在后台执行某些操作,而你的visibleActivity则可以控制这个Service。 (我确定音乐播放器以相同的方式工作,所以文档中的示例似乎有点误导。)如果是这种情况,那么你的Activitycanfinish通常和48868240仍将运行。

一种更简单的方法是捕获Back按钮按下并调用moveTaskToBack(true)以下:

// 2.0 and above
@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

// Before 2.0
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

我认为首选选项应该是一个Activity正常完成并能够重新创建自己,例如如果需要,从服务中读取当前状态。但是,moveTaskToBack可以偶尔用作快速替代品。

注意:正如Dave在Android 2.0下面所指出的那样,新的onBackPressed方法和these recommendations如何处理Back按钮。


#2 热门回答(42 赞)

使用以下代码:

public void onBackPressed() {    
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    startActivity(intent);
}

#3 热门回答(22 赞)

如果你想赶上后退按钮,请看看this post on the Android Developer Blog。它涵盖了在Android 2.0中执行此操作的更简单方法,以及为在1.x和2.0上运行的应用程序执行此操作的最佳方法。

但是,如果你的活动已停止,它仍可能会被杀死,具体取决于设备上的内存可用性。如果你希望在没有UI的情况下运行进程,则应创建一个Service.The documentation says the following about Services:

服务没有可视用户界面,而是在后台无限期地运行。例如,当用户注意其他事项时,服务可能会播放背景音乐,或者它可能通过网络获取数据或计算某些内容并将结果提供给需要它的活动。

这些似乎适合你的要求。