1 需求效果
為了防止用戶點擊返回鍵就直接退出APP,通常會加入一個雙擊退出的要求。
如果用戶在兩秒之內重復點擊了返回鍵,則執行退出操作;如果用戶點擊了一次返回鍵之后,超過兩秒未再次點擊,則不響應退出事件。效果圖如下:
BottomNavigationView.gif
2 需求分析
實現這種需求的整體思路就是監測返回鍵,然后監測是否在指定時間之內再次點擊了返回鍵。
(1)監測返回鍵有三種方式,分別如下:
- onBackPressed( )
- onKeyDown( )
- onKeyUp( )
(2)控制指定時間有兩種方式:
- 使用 Timer()計時器,超出指定時間之后銷毀第一次的點擊事件
- 手動記錄點擊的時間-- System.currenTimeMillis(),判斷兩次點擊的時間是否超過指定時間
3 代碼實現
綜上:整體的實現方式就有六種,分別如下:
(1)第一種辦法
響應Activity的 onKeyUp事件,兩次點擊時間大于2秒鐘就不響應,小于2秒鐘就退出程序
代碼:
//記錄用戶首次點擊返回鍵的時間
private long firstTime = 0;
/**
* 第一種解決辦法 通過監聽keyUp
* @param keyCode
* @param event
* @return
*/
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
long secondTime = System.currentTimeMillis();
if (secondTime - firstTime > 2000) {
Toast.makeText(MainActivity.this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
firstTime = secondTime;
return true;
} else {
finish();
}
}
return super.onKeyUp(keyCode, event);
}
(2)第二種辦法
和第一種辦法一樣,這不過這次響應onKeyDown事件
代碼:
/**
* 第二種辦法
* @param keyCode
* @param event
* @return
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
long secondTime = System.currentTimeMillis();
if (secondTime - firstTime > 2000) {
Toast.makeText(MainActivity.this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
firstTime = secondTime;
return true;
} else{
finish();
}
}
return super.onKeyDown(keyCode, event);
}
(3)第三種辦法
直接重寫onBackPressed()方法
代碼:
/**
* 第三種方法
*/
@Override
public void onBackPressed() {
long secondTime = System.currentTimeMillis();
if (secondTime - firstTime > 2000) {
Toast.makeText(MainActivity.this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
firstTime = secondTime;
} else{
finish();
}
}
(4)第四種辦法
通過線程延時的辦法實現,借助Timer
代碼:
/**
* 第四種方法
*/
@Override
public void onBackPressed() {
if (!mBackKeyPressed) {
Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
mBackKeyPressed = true;
new Timer().schedule(new TimerTask() {
@Override
public void run() {
mBackKeyPressed = false;
}
}, 2000);
} else {
finish();
}
}
(5)第五種辦法
在onKeyUp()方法內使用Timer
/**
* 第五種辦法
* @param keyCode
* @param event
* @return
*/
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
if (!mBackKeyPressed) {
Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
mBackKeyPressed = true;
new Timer().schedule(new TimerTask() {
@Override
public void run() {
mBackKeyPressed = false;
}
}, 2000);
return true;
} else {
finish();
}
}
return super.onKeyUp(keyCode, event);
}
(6)第六種辦法
在onKeyDown()方法內使用Timer
/**
* 第六種辦法
* @param keyCode
* @param event
* @return
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
if (!mBackKeyPressed) {
Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
mBackKeyPressed = true;
new Timer().schedule(new TimerTask() {
@Override
public void run() {
mBackKeyPressed = false;
}
}, 2000);
return true;
} else {
finish();
}
}
return super.onKeyDown(keyCode, event);
}