【问题标题】:Android: Quit application when press back buttonAndroid:按下后退按钮时退出应用程序
【发布时间】:2014-01-02 17:23:19
【问题描述】:

在我的应用程序中,我想在按下返回按钮时退出应用程序,这是我的代码:

@Override
    public void onBackPressed() {
        new AlertDialog.Builder(this).setIcon(android.R.drawable.ic_dialog_alert).setTitle("Exit")
                .setMessage("Are you sure you want to exit?")
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                    }
                }).setNegativeButton("No", null).show();
    }

它工作正常,但是当我退出应用程序时,它并没有完全退出并显示带有我的应用程序徽标的空白页面,当我再次按下应用程序退出按钮时,我该如何修复它???

编辑:

我使用此代码而不是上面的代码,但我的应用程序完全退出,但我希望它在后台运行并且不完全退出,我该怎么做?

@Override
    public void onBackPressed() {
        new AlertDialog.Builder(this).setIcon(android.R.drawable.ic_dialog_alert).setTitle("Exit")
                .setMessage("Are you sure?")
                .setPositiveButton("yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        Intent intent = new Intent(Intent.ACTION_MAIN);
                        intent.addCategory(Intent.CATEGORY_HOME);
                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(intent);
                        finish();
                    }
                }).setNegativeButton("no", null).show();
    } 

【问题讨论】:

  • 这段代码没有编译错误?

标签: android exit back-button


【解决方案1】:

而不是finish() 调用super.onBackPressed()

【讨论】:

  • @Shasika:你说的不对,里面调用一个方法是不对的,我不能在里面调用onBackPressed()!!!
【解决方案2】:

这意味着当您开始此活动时,您在堆栈中的上一个活动。加finish(); 在您调用此活动的行之后。

在您之前的所有活动中。当你开始新的活动时-

startActivity(I);

在此之后添加finish();

【讨论】:

    【解决方案3】:

    当您按下返回然后完成当前活动(例如 A)时,您会看到一个带有应用徽标的空白活动(例如 B),这仅表示完成 A 后显示的活动 B 仍在后台堆栈中,并且活动 A 是从活动 B 开始的,因此在活动中,您应该使用标志作为启动活动 A

    Intent launchNextActivity;
    launchNextActivity = new Intent(B.class, A.class);
    launchNextActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    launchNextActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);                  
    launchNextActivity.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    startActivity(launchNextActivity);
    

    现在您的活动 A 在堆栈顶部,而您的应用程序的其他活动在后台堆栈中没有。

    现在在你想要实现 onBackPressed 关闭应用程序的活动 A 中,你可以做这样的事情,

    private Boolean exit = false;
    @Override
        public void onBackPressed() {
            if (exit) {
                finish(); // finish activity
            } else {
                Toast.makeText(this, "Press Back again to Exit.",
                        Toast.LENGTH_SHORT).show();
                exit = true;
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        exit = false;
                    }
                }, 3 * 1000);
    
            }
    
        }
    

    这里的Handler处理意外的回压,它只是显示一个Toast,如果3秒内有另一个回压,它会关闭应用程序。

    【讨论】:

    • 我只是不知道我的应用程序中的“NEXT_ACTIVITY”是什么,我将我的代码添加到我希望退出按钮在此页面上工作的活动中,但在您的代码中我不知道我的页面将是 NEXT_ACTIVITY。
    • 优雅。只是不确定 Home.this 是什么。刚刚删除它并离开了finish();
    • @samleighton87 是的,这不是必需的,只需完成即可。 (家是我的活动名称)
    • @RachitMishra 超级答案......你拯救了我的一天......谢谢 +1 投票给你。
    • 有关Intent options/flags/etc 的文档,请参阅here
    【解决方案4】:

    Finish 不会关闭应用程序,它只是关闭活动。如果这是启动器活动,那么它将关闭您的应用程序;如果没有,它会回到之前的活动。

    您可以做的是使用 onActivityResult 触发尽可能多的 finish() 以关闭所有打开的活动。

    【讨论】:

    【解决方案5】:

    试试这个:

    Intent intent = new Intent(Intent.ACTION_MAIN);
              intent.addCategory(Intent.CATEGORY_HOME);
              intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//***Change Here***
              startActivity(intent);
              finish();
              System.exit(0);
    

    【讨论】:

    • 谢谢!它在没有System.exit(0); 的情况下重新启动
    • 不好的做法,从主页按钮杀死应用程序,并使用 System.exit(0);在最后一个活动中单击后退按钮后,我们必须保留系统终止应用程序
    【解决方案6】:

    使用这个代码非常简单的解决方案

     @Override
        public void onBackPressed() {
          super.onBackPressed(); // this line close the  app on backpress
     }
    

    【讨论】:

    • 重写某些方法并只调用超级实现的目的是什么?
    • 错误答案。 super.onBackPressed() 不会退出应用程序,除非这是根活动。此外,如果您只调用super,为什么要覆盖?
    【解决方案7】:

    这对我有用。我自己通过结合其他答案找到了它

    private Boolean exit = false;
    @override
    public void onBackPressed(){ 
        if (exit) {
            finish(); // finish activity
        } 
        else {
            Toast.makeText(this, "Press Back again to Exit.",
                Toast.LENGTH_SHORT).show();
             exit = true;
             new Handler().postDelayed(new Runnable() {
    
             @Override
             public void run() {
                 // TODO Auto-generated method stub
                 Intent a = new Intent(Intent.ACTION_MAIN);
                 a.addCategory(Intent.CATEGORY_HOME);
                 a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                 startActivity(a);
            }
        }, 1000);
    }
    

    【讨论】:

      【解决方案8】:

      我遇到了同样的问题,我有一个 LoginActivity 和一个 MainActivity。 如果我单击 MainActivity 中的后退按钮,应用程序必须关闭。 所以我用 OnBackPressed 方法做了。此 moveTaskToBack() 与 Home 按钮一样工作。它使 Back 堆栈保持原样。

      public void onBackPressed() {
        //  super.onBackPressed();
          moveTaskToBack(true);
      
      }
      

      【讨论】:

      • 极好的解决方案。赞一个!
      【解决方案9】:

      据我了解,Google 希望 Android 能够处理内存管理和关闭应用程序。如果您必须从代码中退出应用程序,让 Android 运行垃圾收集器可能会有所帮助。

      @Override
      public void onBackPressed(){
          System.gc();
          System.exit(0);
      }
      

      您也可以在代码中添加finish(),但如果您还使用System.exit(0),这可能是多余的

      【讨论】:

        【解决方案10】:

        似乎没有人在 manifest.xml 中推荐 noHistory="true" 以防止在您按下返回按钮后出现某些活动,该按钮默认调用方法完成()

        【讨论】:

          【解决方案11】:

          为了在按下返回按钮时退出应用程序,您必须先清除所有*活动,然后启动安卓手机的 ACTION_MAIN

          所以,你只需要编写下面提到的所有这些代码:

          注意:在你的情况下 MainActivity 被 YourActivity 取代

          @Override
          public void onBackPressed() {
          
                  new AlertDialog.Builder(this)
                          .setTitle("Really Exit?")
                          .setMessage("Are you sure you want to exit?")
                          .setNegativeButton(android.R.string.no, null)
                          .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                              @Override
                              public void onClick(DialogInterface dialog, int which) {
                                  MainActivity.super.onBackPressed();
                                  quit();
                              }
                          }).create().show();
              }
          
          
          public void quit() {
                  Intent start = new Intent(Intent.ACTION_MAIN);
                  start.addCategory(Intent.CATEGORY_HOME);
                  start.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                  start.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                  startActivity(start);
              }
          

          【讨论】:

            【解决方案12】:

            试试这个

            Intent a = new Intent(Intent.ACTION_MAIN);
            a.addCategory(Intent.CATEGORY_HOME);
            a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(a);
            

            【讨论】:

              【解决方案13】:

              我找到了很好的解决方案:

              @Override
              public void onBackPressed() {
              
                  int idItem = navView.getSelectedItemId();
                  if (R.id.navigation_home == idItem){
                      final AlertDialog.Builder builder = new AlertDialog.Builder(this);
                      builder.setMessage("do you want to go back sir?")
                              .setCancelable(true)
                              .setPositiveButton("yes", new DialogInterface.OnClickListener() {
                                  public void onClick(final DialogInterface dialog, final int id) {
                                      dialog.dismiss();
                                      finish();
                                  }
                              })
                              .setNegativeButton("No", new DialogInterface.OnClickListener() {
                                  public void onClick(final DialogInterface dialog, final int id) {
              
                                      dialog.dismiss();
              
                                  }
                              });
                      builder.create().show();
                  }
                  else{
                      super.onBackPressed();  // this line make back action
                  }
              
              }
              

              【讨论】:

                最近更新 更多