Sudheesh B Nair在这个问题上有一个不错的(并且被接受)答案,我认为应该有一个更好的选择,例如;
测量经过的时间并检查TIME_INTERVAL
自上次反向按压以来是否经过了毫秒(例如2000年),这是怎么回事?以下示例代码用于System.currentTimeMillis();
存储onBackPressed()
被调用的时间;
private static final int TIME_INTERVAL = 2000; // # milliseconds, desired time passed between two back presses.
private long mBackPressed;
@Override
public void onBackPressed()
{
if (mBackPressed + TIME_INTERVAL > System.currentTimeMillis())
{
super.onBackPressed();
return;
}
else { Toast.makeText(getBaseContext(), "Tap back button in order to exit", Toast.LENGTH_SHORT).show(); }
mBackPressed = System.currentTimeMillis();
}
回到公认的答案批判 ; 使用a flag
指示是否在最后一个TIME_INTERVAL
(例如2000年)毫秒内按下它并进行设置-重置是通过Handler
的postDelayed()
方法,这是我想到的第一件事。但是,postDelayed()
在活动结束时应取消操作,删除Runnable
。
为了删除Runnable
,不得将其声明为匿名,Handler
也应将其声明为成员。然后可以适当地调用的removeCallbacks()
方法Handler
。
以下示例是演示;
private boolean doubleBackToExitPressedOnce;
private Handler mHandler = new Handler();
private final Runnable mRunnable = new Runnable() {
@Override
public void run() {
doubleBackToExitPressedOnce = false;
}
};
@Override
protected void onDestroy()
{
super.onDestroy();
if (mHandler != null) { mHandler.removeCallbacks(mRunnable); }
}
@Override
public void onBackPressed() {
if (doubleBackToExitPressedOnce) {
super.onBackPressed();
return;
}
this.doubleBackToExitPressedOnce = true;
Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();
mHandler.postDelayed(mRunnable, 2000);
}
感谢@NSouth的贡献;为了防止即使在关闭应用程序后仍会显示吐司消息,Toast
可以声明为成员(例如mExitToast
),也可以通过mExitToast.cancel();
在super.onBackPressed();
调用之前取消该消息。