覆盖后退按钮,就像home键一样

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

在Android 文档中,它声明:

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

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

我认为有三种可能……

  1. 捕获返回键按下(如下所示),然后调用home键调用的任何方法。

    @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);
    }
    
  2. Capture the back button press and then spoof a home button press.

  3. Capture the back button press, then start an Activity of the home screen, effectively putting my application's Activity into the stopped state.

Edit: I know about services and am using one in the application to which this problem is related. This question is specifically about putting the Activity into the stopped state rather than the destroyed state on pressing the back button.

321774 次浏览

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

一个更简单的方法是捕获Back按钮按下并调用moveTaskToBack(真正的),如下所示:

// 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
}


}

希望它能帮助到某人, 欢呼声< / p >

我已经使用@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,因此请确保__abc0不做任何冗长的操作。

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

这也是一个执行停止动画和其他消耗大量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键一样。它不会结束你的活动,而是把它带到后台

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

在android2.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);
}