单击后退按钮两次以退出活动

2022-08-31 04:44:26

我最近在很多Android应用程序和游戏中注意到这种模式:当单击后退按钮“退出”应用程序时,会出现类似于“请再次单击BACK退出”的消息。Toast

我想知道,随着我越来越频繁地看到它,这是一个内置功能,你可以以某种方式在活动中访问吗?我已经查看了许多类的源代码,但我似乎找不到任何关于此的内容。

当然,我可以考虑几种方法来轻松实现相同的功能(最简单的可能是在活动中保留一个布尔值,指示用户是否已经点击过一次......),但我想知道这里是否已经存在一些东西。

编辑:正如@LAS_VEGAS提到的,我并不是传统意义上的“退出”。(即终止)我的意思是“返回到应用程序启动活动启动之前打开的任何内容”,如果这有意义,:)


答案 1

在 Java 活动中:

boolean doubleBackToExitPressedOnce = false;

@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();
        
    new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
        
        @Override
        public void run() {
            doubleBackToExitPressedOnce=false;                       
        }
    }, 2000);
} 

在 Kotlin 活动中:

private var doubleBackToExitPressedOnce = false
override fun onBackPressed() {
        if (doubleBackToExitPressedOnce) {
            super.onBackPressed()
            return
        }

        this.doubleBackToExitPressedOnce = true
        Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show()

        Handler(Looper.getMainLooper()).postDelayed(Runnable { doubleBackToExitPressedOnce = false }, 2000)
    }

我认为这个处理程序有助于在2秒后重置变量。


答案 2

Sudheesh B Nair在这个问题上有一个很好的(和被接受的)答案,我认为这应该有一个更好的选择,例如;

测量经过的时间并检查自上次反向按下以来是否经过了毫秒(例如2000)有什么问题。以下代码示例用于存储时间被调用;TIME_INTERVALSystem.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();
}

回到公认的答案批评;使用一个标志来指示它是否在最后(比如2000)毫秒内按下并设置- 重置是通过 的方法,这是我脑海中出现的第一件事。但是,当活动关闭时,应取消该操作,并删除 .TIME_INTERVALHandlerpostDelayed()postDelayed()Runnable

为了删除 ,它不得被声明为匿名,并且与成员一起声明为成员。那么方法就可以适当地调用。RunnableHandlerremoveCallbacks()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消息,可以声明为成员 - 例如 - 并且可以通过调用前取消。ToastmExitToastmExitToast.cancel();super.onBackPressed();


推荐