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

新手上路,请多包涵

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

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

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

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

原文由 Guillaume 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 367
2 个回答

在 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 秒后重置变量。

原文由 Sudheesh B Nair 发布,翻译遵循 CC BY-SA 4.0 许可协议

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();
}


回到接受的答案 _批评_; Using a flag to indicate if it was pressed in last TIME_INTERVAL (say 2000) milliseconds and set - reset is via Handler ’s 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 消息_, Toast 可以声明为成员 - 比如 mExitToast - 可以通过取消 mExitToast.cancel();super.onBackPressed(); 调用之前。

原文由 Saro Taşciyan 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题