在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;
}