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

bdl*_*dls 248 java android overriding back android-button

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

在Android 文档中,它指出:

...当按下BACK时,并非所有活动都具有被销毁的行为.当用户开始在音乐应用程序中播放音乐然后按BACK时,应用程序将覆盖正常的后退行为,防止播放器活动被破坏,并继续播放音乐,即使其活动不再可见

如何在我自己的应用程序中复制此功能?

我认为必须有三种可能性......

  1. 捕获后退按钮(如下所示),然后调用主页按钮调用的任何方法.

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
            Log.d(this.getClass().getName(), "back button pressed");
        }
        return super.onKeyDown(keyCode, event);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 按下后退按钮,然后按下主页按钮.

  3. 捕获后退按钮,然后启动主屏幕的活动,有效地将我的应用程序的活动置于停止状态.

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

Mir*_* N. 334

大多数情况下,您需要创建一个服务来在后台执行某些操作,并且您可见的Activity只是控制它Service.(我确定音乐播放器以相同的方式工作,所以文档中的示例似乎有点误导.)如果是这样的话,那么你Activity可以finish像往常一样Service继续运行.

一种更简单的方法是捕获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);
}
Run Code Online (Sandbox Code Playgroud)

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

注意:正如Dave下面指出的Android 2.0引入了一种新onBackPressed方法,这些建议如何处理Back按钮.

  • 请阅读http://android-developers.blogspot.com/2009/12/back-and-other-hard-keys-three-stories.html以获取处理后退密钥的推荐方法. (4认同)

Ani*_*kar 45

使用以下代码:

public void onBackPressed() {    
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    startActivity(intent);
}
Run Code Online (Sandbox Code Playgroud)


Dav*_*ebb 23

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

但是,如果您的活动已停止,它仍可能会被杀死,具体取决于设备上的内存可用性.如果您希望在没有UI的情况下运行流程,则应创建一个Service.文档说明以下有关服务:

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

这些似乎适合您的要求.


m-s*_*lik 18

尝试覆盖onBackPressed()android.app.Activity类中定义的void .


cra*_*igk 14

如果它可以帮助其他人,我有一个活动有2个布局,我打开和关闭visibilty,试图模仿一种page1> page2结构.如果他们在第2页并按下后退按钮我想让他们回到第1页,如果他们按下第1页上的后退按钮它应该仍然正常工作.它很基本,但它的工作原理

@Override
public void onBackPressed() {
// check if page 2 is open
    RelativeLayout page2layout = (RelativeLayout)findViewById(R.id.page2layout);
    if(page2layout.getVisibility() == View.VISIBLE){
        togglePageLayout(); // my method to toggle the views
        return;
    }else{
        super.onBackPressed(); // allows standard use of backbutton for page 1
    }

}
Run Code Online (Sandbox Code Playgroud)

希望它可以帮助别人,欢呼


Xar*_*mer 9

工作实例..

确保不要调用super.onBackPressed();

@Override
public void onBackPressed() {
   Log.d("CDA", "onBackPressed Called");
   Intent setIntent = new Intent(Intent.ACTION_MAIN);
   setIntent.addCategory(Intent.CATEGORY_HOME);
   setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   startActivity(setIntent);
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您的后退按钮就像主页按钮一样.它不会完成您的活动,但会将其带到后台

第二种方式是打电话 moveTaskToBack(true);,onBackPressed一定要删除super.onBackPressed