Android中连续点击两次BACK键退出程序

    在Android开发中,我们正常退出程序时,经常会设置这样一个小特色,就是短时间内连续按下两次BACK键才会将程序退出,对于这种设置,我们通常会使用两种方式来解决。

    一、通过记录两次按下BACK键的时间差来判断

    这种方式也比较好理解一点,我们可以设置一个第一次点击的时间变量和第二次点击的时间变量,通过两次点击的时间差是否在一个规定的时间段内即可,例如,当第二次按下时与第一次按下时的时间差在两秒以内,就会退出程序,否则,不退出,具体实现以代码为例,逻辑很简单,就不多说了:

public class MainActivity extends AppCompatActivity {

    /**
     * 设置第一次点击的时间
     */
    private long firstTime = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // 判断,如果点击时间为按下BACK键
        if(keyCode == KeyEvent.KEYCODE_BACK) {
            long secondTime = System.currentTimeMillis() ;
            if(secondTime - firstTime > 2000) {
                Log.d("","间隔大于2s") ;
                // 当两次按键时间间隔大于2s时
                Toast.makeText(this,"再按一次退出",Toast.LENGTH_LONG).show() ;
                firstTime = secondTime ;
                return true ;
            } else {
                // 两次按键时间间隔小于2s,退出程序
                Log.d("","间隔小于2s") ;
                System.exit(0) ;
            }
        }
        return super.onKeyDown(keyCode, event);
    }

}

    二、开启线程进行延时处理

    我们还可以这样做,首先设置一个全局变量来判断是否需要退出,当我们第一次按下BACK键时,设置全局变量为退出标识符,同时开启一个线程,延迟一个时间段(例如延迟2s),如果在线程执行完之前,又再次按下了BACK键,就会执行退出操作,但是,若线程执行完了依旧没有再次按下(也就是说在规定时间段内没有按下两次BACK键),则将全局变量设置为不退出标识符,其实逻辑也比较简单,代码如下:

public class MainActivity extends AppCompatActivity {

    /**
     * 设置一个全局变量来控制是否退出
     */
    private boolean isExit = false ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    @Override
    public void onBackPressed() {

        if(isExit == false) {
            // 当第一次按下BACK键时,提示,并将isExit设置为true
            Toast.makeText(this,"再按一次退出",Toast.LENGTH_LONG).show() ;
            isExit = true ;
            new Thread() {

                @Override
                public void run() {
                    try {
                        // 延迟2s
                        Thread.sleep(2000) ;
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } finally {
                        // 如果2s内没有再次按下BACK键,则isExit设置为false
                        isExit = false ;
                    }
                }
            }.start() ;
            return ;
        } else {
            // 如果在线程执行完之前(即2s内)再次按下BACK键,则退出当前程序
            Main2Activity.this.finish() ;
        }
        super.onBackPressed();
    }

}

    以上两种方式的执行效果是一样的,具体你喜欢哪种方式就是仁者见仁,智者见智了。

    PS:onBackPressed()的使用

    在这里我稍微解释一下这个onBackPressed()方法,我们在Android中,接受按下BACK键时,可以通过onKeyUP(int keyCode, KeyEvent event)或者onKeyDown(int keyCode, KeyEvent event)这两个方法,通过判断KeyEvent的值是否为KEYCODE_BACK,得知是否为按下BACK键,但是在Android 2.0之后,又更新了一个方法,那就是onBackPressed(),我们可以直接在Activity中重写onBackPressed()方法,从而直接在Activity中直接判断按下BACK键,不过这个方法只适用于2.0以后的版本。

@Override
public void onBackPressed() {

    // 这里处理逻辑代码,大家注意:该方法仅适用于2.0或更新版的sdk
    return;

}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若邪〃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值