Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 覆盖“后退”按钮,使其与“主页”按钮类似_Java_Android_Overriding_Android Button_Back - Fatal编程技术网

Java 覆盖“后退”按钮,使其与“主页”按钮类似

Java 覆盖“后退”按钮,使其与“主页”按钮类似,java,android,overriding,android-button,back,Java,Android,Overriding,Android Button,Back,按下后退按钮时,我希望我的应用程序进入停止状态,而不是销毁状态 在Android中,它表示: …并非所有活动都具有在按下BACK时被销毁的行为。当用户开始在音乐应用程序中播放音乐,然后按BACK键时,应用程序将覆盖正常的BACK行为,防止播放器活动被破坏,并继续播放音乐,即使其活动不再可见 如何在自己的应用程序中复制此功能? 我想一定有三种可能 按下后退按钮(如下),然后调用home按钮调用的任何方法 @Override public boolean onKeyDown(int keyCode,

按下后退按钮时,我希望我的应用程序进入停止状态,而不是销毁状态

在Android中,它表示:

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

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

我想一定有三种可能

  • 按下后退按钮(如下),然后调用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);
    }
    
  • 捕捉“后退”按钮按下,然后模仿“主页”按钮按下

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

  • 编辑:
    我了解服务,并在与此问题相关的应用程序中使用服务。此问题特别是关于按下后退按钮时将活动置于停止状态而不是销毁状态。

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

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

    // 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引入了一种新的
    on backpressed
    方法,以及如何处理后退按钮。

    如果你想抓住后退按钮,请看一看。它涵盖了在Android2.0中实现这一点的简单方法,以及在1.x和2.0上运行的应用程序实现这一点的最佳方法

    但是,如果您的活动停止,它仍可能被终止,具体取决于设备上的内存可用性。如果希望流程在没有UI的情况下运行,则应创建一个
    服务

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


    这些似乎适合您的要求。

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

    如果它对其他人有帮助,我有一个带有两个布局的活动,我可以打开和关闭,以便于查看,尝试模拟一种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.answser,使用新的自定义编辑文本

     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);
    }
    
    更好的是,你觉得:

    当某个活动进入后台但尚未被终止时,作为活动生命周期的一部分调用。onResume()的对应项

    当在活动A前面启动活动B时,将在A上调用此回调。在A的onPause()返回之前,不会创建B,因此请确保
    在此处输入代码
    不要在此处执行任何冗长的操作

    此回调主要用于保存活动正在编辑的任何持久状态,并确保在没有足够资源启动新活动而不首先终止此活动时不会丢失任何内容

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

    工作示例

    确保不要调用super.onBackPressed()

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

    第二种方法是调用
    moveTaskToBack(true)super.onBackPressed

    覆盖onBackPressed()。 比如


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

    Intent.FLAG\u ACTIVITY\u CLEAR\u 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);
      }
    

    moveTaskToBack()似乎可以根据需要工作。使用这种方法的缺点是什么?在某些情况下,这可能不会像预期的那样起作用吗?在更仔细地阅读了它的文档之后,我实际上认为它应该可以起作用。(我最初认为它适用于活动,但实际上它说的是“包含此活动的任务”。)但你当然应该自己测试它。:)多亏了米尔科,这个方法似乎很有效。如果你在回答的底部更加突出你的编辑,这可能会很酷,因为这正是我想要的!请阅读以了解处理back键的建议方法。@理论上,如果后台活动资源不足,系统可能会杀死它,因此为了安全起见,它应该能够重新创建自己。我看了一眼sourc
    @Override
    public void onBackPressed() {
        moveTaskToBack(true);
    }
    
      @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);
      }