首页 文章

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

提问于
浏览
237

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

在Android docs中它说明:

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

How do I replicate this functionality in my own application?

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

  • 按下后退按钮(如下所示),然后调用主页按钮调用的任何方法 .
@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);
}
  • 按下后退按钮,然后按下主页按钮 .

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

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

9 回答

  • 43

    大多数情况下,你需要创建一个Service来在后台执行某些操作,而你的可见 Activity 只是控制这个 Service . (我'm sure the Music player works in the same way, so the example in the docs seems a bit misleading.) If that'是这样的,那么你的 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);
    }
    

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

    NOTE :正如Dave在Android 2.0下面所指出的那样引入了一个新的 onBackPressed 方法,并且these recommendations就如何处理Back按钮 .

  • 329

    使用以下代码:

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

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

    但是,如果您的活动已停止,它仍可能会被杀死,具体取决于设备上的内存可用性 . 如果您希望在没有UI的情况下运行流程,则应创建 Service . The documentation says the following about Services:

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

    这些似乎适合您的要求 .

  • -1

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

  • 22

    如果它帮助其他人,我有一个活动有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
        }
    
    }
    

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

  • 8

    工作实例..

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

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

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

  • 0

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

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

    当在活动A前面启动活动B时,将在A上调用此回调 . 在A的onPause()返回之前不会创建B,所以一定要在这里做任何冗长的事情 .

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

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

  • 13

    在android 2.0之后覆盖onBackPressed() . 如

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

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

    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);
    

    谢谢 .

相关问题