【问题标题】:Close the app when back button clicked twice单击后退按钮两次时关闭应用程序
【发布时间】:2016-02-12 17:46:19
【问题描述】:

我的活动流程如下所示

LogIn Activity-> Activity A(Main Page)->Activity B-> Activity C

当C中的按钮被点击时,它会指向A。

当A中的后退按钮被按下两次时,它应该关闭应用程序。

  boolean doubleBackToExitPressedOnce = false;
     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().postDelayed(new Runnable() {
                @Override
                public void run() {
                    doubleBackToExitPressedOnce = false;
                    Intent a = new Intent(Intent.ACTION_MAIN); // close app code
                    a.addCategory(Intent.CATEGORY_HOME);
                    a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(a);
                }
            },2000);

问题:

当我按一次按钮时,它会显示Please click BACK again to exit,然后它会自动关闭应用程序,即使我 没有点击两次按钮。

如果我单击该按钮两次,它将返回登录活动。什么是 正确的书写方式?谢谢

编辑

如果我删除 intent

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

            }
        },2000);


    }

当双击返回按钮时,它会再次返回到Activity C。

【问题讨论】:

  • 为什么会有这样的意图?删除意图代码。调用完成而不是超级,应该没问题
  • @PedroOliveira 我不想使用finish()。我在所有活动中都有返回按钮,我想返回上一个活动。
  • 然后保持超级。但删除意图逻辑
  • “我想在 Activity A 中双击时,它会关闭应用程序”然后在 Activity A 中调用 finishAffinaty(); 当你在 A.doubleBackPress 上时 :)

标签: java android button


【解决方案1】:

也许只使用long lastTimePressed=0L; 并在其中存储System.currentTimeMillis();if(System.currentTimeMillis()-lastTimePressed>2000) finish();

Toast.Length_SHORT 为 2000,Toast.LENGTH_LONG 为 3500

long lastTimePressed=0L;

@Override
public void onBackPressed (){
    if(System.currentTimeMillis()-lastTimePressed>2000) //short Toast duration, now should be faded out
        finish();
    else
        Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();

    lastTimePressed=System.currentTimeMillis();
}

不要开始新的Activity(或者也许?如果你已经实现了singleTasksingleTopnoHistory,但我怀疑)。 finish();super.onBackPressed(); 实际上也是这样做的。稍后在 API5 中添加了覆盖 onBackPressed 的可能性,因为它非常有用:)

哦,现在我看到了您的编辑,一切都清楚了。不要使用startActivity 开始您的活动,而是使用startActivityForResult。还实现onActivityResult (check out here)。当你使用

private static final int MY_RESULT_IS_KILL_MY_APP=4573; //random

setResult(MY_RESULT_IS_KILL_MY_APP);
finish();

并且下面的Activity 在自己的onActivityResult 中接收到它也应该设置这个结果并调用finish();。这样一来,活动堆栈就会被清除,整个应用程序将退出。如果不设置此静态结果 finish(); 将仅完成当前的 Activity

【讨论】:

  • 我应该在哪里添加 Toast ?
  • 感谢您的回答,我使用@Predro 回答。 finishAffinity 成功了 :)
  • 是的,不知道那个方法。好多了 :) 注意以备将来使用!
  • 感谢您之间的帮助。赞赏
【解决方案2】:

在打开活动 A 之前完成登录活动。就是这样。

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

【讨论】:

  • 你们俩都不明白,一旦按下就会调用new Handler().post(...并且永远不会取消它,所以即使是第一个并且只按下也会在2秒后关闭MainActivity
  • 我明白你想要什么哥们,当你从 LogIn Activity 开始活动 A 时,一定要通过调用 LogInActivity.this.finish(); 关闭 LogInActivity;
  • 但问题是当我点击 A 中的后退按钮时,它会再次返回到活动 C,我不想在 B 和 C 中有 finish(),因为我有一个后退按钮两种活动。
【解决方案3】:
@Override
public void onBackPressed() {
if (doubleBackToExitPressedOnce) {
    super.onBackPressed();
    return;
}

this.doubleBackToExitPressedOnce = true;
Toast.makeText(this, "Press again to exit", Toast.LENGTH_SHORT).show();

new Handler().postDelayed(new Runnable() {

    @Override
    public void run() {
        doubleBackToExitPressedOnce=false;                       
    }
 }, 2000);
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多