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

在Android文档中,它写道:

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

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

我认为有三种可能……

Capture the back button press (as below) and then call whatever method(s) the home button calls. @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); } Capture the back button press and then spoof a home button press. Capture the back button press, then start an Activity of the home screen, effectively putting my application's Activity into the stopped state.

编辑: 我了解服务,并且正在使用与此问题相关的应用程序中的一个服务。这个问题是关于在按后退按钮时将Activity置于停止状态而不是破坏状态。


大多数时候,你需要创建一个服务来在后台执行一些事情,而你的可见活动只是控制这个服务。(我确信音乐播放器的工作方式是一样的,所以文档中的例子似乎有点误导。)如果是这种情况,那么您的活动可以照常完成,服务仍将运行。

一个更简单的方法是捕捉后退按钮,并调用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);
}

我认为首选的选项应该是让一个活动正常完成,并能够重新创建自己,例如,如果需要,从服务读取当前状态。但moveTaskToBack有时可以作为一种快速的替代方法。

注意:正如Dave在下面指出的,Android 2.0引入了一个新的onBackPressed方法,以及这些关于如何处理后退按钮的建议。


如果你想抓住后退按钮,可以看看Android开发者博客上的这篇文章。它涵盖了在Android 2.0中更简单的方法,以及运行在1上的应用程序的最佳方法。X和2.0。

然而,如果你的活动是停止,它仍然可能被杀死,这取决于设备上的内存可用性。如果你想让一个进程在没有UI的情况下运行,你应该创建一个Service。关于Services,文档说明如下:

服务没有可视化用户界面,而是在后台运行一段不确定的时间。例如,服务可以在用户处理其他事务时播放背景音乐,或者通过网络获取数据或计算某些内容并将结果提供给需要它的活动。

这些似乎适合您的要求。


尝试重写android.app.Activity类中定义的void onBackPressed()。


如果它能帮助别人,我有一个活动有2个布局,我切换打开和关闭的可见性,试图模拟一种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
    }

}

希望它能帮助到别人, 干杯


我已经使用@Mirko N. answer使用新的自定义编辑文本

 public class EditViewCustom extends EditText {

    Button cancelBtn;
    RelativeLayout titleReleLayout;
    public EditViewCustom(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public EditViewCustom(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EditViewCustom(Context context) {
        super(context);
    }

    public void setViews(Button cancelBtn,RelativeLayout titleReleLayout){
        this.cancelBtn = cancelBtn;
        this.titleReleLayout = titleReleLayout;
    }

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            Log.d("KEYCODE_BACK","KEYCODE_BACK");
            cancelBtn.setVisibility(View.GONE);
            this.setFocusableInTouchMode(false);
            this.setFocusable(false);
            titleReleLayout.setVisibility(View.VISIBLE);

            return super.onKeyPreIme(keyCode, event);
          }

        return super.onKeyPreIme(keyCode, event);
    }

}

然后从你的活动中设置数据

 searchEditView.setViews(cancelBtn, titleRelativeLayout);

谢谢你!


使用以下代码:

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

更好的是,OnPause()怎么样:

当一个活动进入后台,但(还)没有被杀死时,作为活动生命周期的一部分调用。对应onResume()。

当活动B在活动A之前启动时,这个回调将在A上被调用,直到A的onPause()返回才会创建B,所以一定要在这里输入代码,不要在这里做任何冗长的事情。

此回调主要用于保存活动正在编辑的任何持久状态,并确保如果没有足够的资源来启动新活动而不首先杀死该活动,则不会丢失任何内容。

这也是一个执行停止动画和其他消耗大量CPU的操作的好地方,以便尽可能快地切换到下一个活动,或关闭独占访问资源(如相机)。


工作示例。

确保不要调用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);
}

这样你的后退键就像Home键一样。它不会结束你的活动,而是把它带到后台

第二种方法是调用moveTaskToBack(true);在onBackPressed中,确保删除super.onBackPressed


在android 2.0之后重写onBackPressed()。 如

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

我已经尝试了以上所有的解决方案,但没有一个对我有效。下面的代码帮助了我,当我试图以一种onCreate被调用的方式返回MainActivity:

意图。FLAG_ACTIVITY_CLEAR_TOP是键。

  @Override
  public void onBackPressed() {
      Intent intent = new Intent(this, MainActivity.class);
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
      startActivity(intent);
  }