关于java:覆盖后退按钮,就像主页按钮一样

Override back button to act like home button

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

在Android文档中,它指出:

...not all activities have the behavior that they are destroyed when BACK is pressed. When the user starts playing music in the Music application and then presses BACK, the application overrides the normal back behavior, preventing the player activity from being destroyed, and continues playing music, even though its activity is no longer visible

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

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

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

    1
    2
    3
    4
    5
    6
    7
    @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);
    }
  • 按下后退按钮,然后按下主页按钮。

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

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


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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // 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方法,并且这些建议如何处理Back按钮。


    使用以下代码:

    1
    2
    3
    4
    5
    6
    public void onBackPressed() {    
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_HOME);
        startActivity(intent);
    }


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

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

    A service doesn't have a visual user interface, but rather runs in the background for an indefinite period of time. For example, a service might play background music as the user attends to other matters, or it might fetch data over the network or calculate something and provide the result to activities that need it.

    这些似乎适合您的要求。


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


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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @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
        }

    }

    希望它可以帮助某人,
    干杯


    工作实例..

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

    1
    2
    3
    4
    5
    6
    7
    8
    @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);
    }

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

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


    在android 2.0之后覆盖onBackPressed()。

    1
    2
    3
    4
    @Override
    public void onBackPressed() {
        moveTaskToBack(true);
    }

    更好的是,OnPause()如何:

    当活动进入后台但被(但)尚未被杀死时,被称为活动生命周期的一部分。 onResume()的对应部分。

    当在活动A前面启动活动B时,将在A上调用此回调。在A的onPause()返回之前不会创建B,因此请确保enter code here在此处不做任何冗长的操作。

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

    这也是一个很好的做法,例如停止动画和其他消耗大量CPU的事情,以便尽快切换到下一个活动,或者关闭独占访问的资源,如摄像头。


    我使用@Mirko N.应答器使用了新的Custom EditText

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     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);
        }

    }

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

    1
     searchEditView.setViews(cancelBtn, titleRelativeLayout);

    谢谢。