在安卓开发中,我们经常要对按键进行监听,今天跟大家分享一下最常用的按下返回退出功能的实现.
如果没有对返回键设置监听,通常按下一次返回键就会退出程序或退出某个界面,这样是很不人性化的,我们可以有两种处理方式:

  • 按下返回键时弹出一个对话框(AlertDialog),再让用户选择是否退出
  • 双击返回退出

下面分别介绍着两种实现方式

1. 按下返回键时弹出一个对话框(AlertDialog),再让用户选择是否退出

实现思路:

  • 重写onKeyDown方法
  • 在方法中,判断返回按键被按下的时候创建一个对话框并显示
  • 给对话框的按钮设置点击监听

代码示例:

//重写onKeyDown方法,对按键(不一定是返回按键)监听
public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {//当返回按键被按下
            AlertDialog.Builder dialog = new AlertDialog.Builder(context);//新建一个对话框
            dialog.setMessage("确定要退出测试吗?");//设置提示信息
            //设置确定按钮并监听
            dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    finish();//结束当前Activity
                }
            });
            //设置取消按钮并监听
            dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                //这里什么也不用做
                }
            });
            dialog.show();//最后不要忘记把对话框显示出来
        }
        return false;
    }

这样,就实现了点击返回按键时弹出对话框,并交由用户处理退出的功能

2.双击返回退出

实现思路:

  • 重写onKeyDown方法
  • 声明一个全局的布尔值isExit,默认为false
  • 第一次点击返回按键时,弹出Toast提示,并调用exit()方法
  • exit()方法中,判断isExit值,并执行相应逻辑(具体看代码吧,原谅我真不知道怎么描述了……)

代码示例:

//声明一个全局布尔值,默认为false
public boolean isExit = false;

//重写onKeyDown方法,
public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {//当返回按键被按下
        //调用exit()方法
        exit();
        }
        return false;
    }

//被调用的exit()方法
private void exit() {
        Timer timer;//声明一个定时器
        if (!isexit) {  //如果isExit为false,执行下面代码
            isexit = true;  //改变值为true
            Toast.makeText(TestActivity.this, "再按一次退出测试", Toast.LENGTH_SHORT).show();  //弹出提示
            timer = new Timer();  //得到定时器对象
            //执行定时任务,两秒内如果没有再次按下,把isExit值恢复为false,再次按下返回键时依然会进入if这段代码
            timer.schedule(new TimerTask() {  
                @Override
                public void run() {
                    isexit = false;
                }
            }, 2000);
        } else {//如果两秒内再次按下了返回键,这时isExit的值已经在第一次按下时赋值为true了,因此不会进入if后的代码,直接执行下面的代码
            finish();
        }
    }

嗯,就这样,双击退出的功能也实现了,如果看不懂,建议大家自己写一遍就能明白逻辑了.