离开Android应用程序与后退按钮

时间:2013-07-25 08:32:59

标签: android back android-lifecycle

我希望我的Android应用的用户在按某个活动时退出我的应用。可以这样做吗?

14 个答案:

答案 0 :(得分:7)

一个好方法是等待第二次回来

private boolean             _doubleBackToExitPressedOnce    = false;

@Override
public void onBackPressed() {

    Log.i(TAG, "onBackPressed--");
    if (_doubleBackToExitPressedOnce) {
        super.onBackPressed();
        return;
    }
    this._doubleBackToExitPressedOnce = true;
    Toast.makeText(this, "Press again to quit", Toast.LENGTH_SHORT).show();
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {

            _doubleBackToExitPressedOnce = false;
        }
    }, 2000);
}

答案 1 :(得分:6)

您可以尝试这样的事情(显示确认退出的对话框):

        @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();
                                    System.exit(0);
                                }
                            }).setNegativeButton("No", null).show();
                }

必须注意,因为在下面的评论中提到不建议退出使用System.exit的应用程序。一种更“正确”的方式可能是广播一个背压意图,如果你的应用程序的活动收到了意图就完成了。

答案 2 :(得分:6)

你可以尝试这个

public void onBackPressed() {
    moveTaskToBack(true);
}

答案 3 :(得分:5)

将它放在你Manifest的每个活动中:

<activity android:name=".MyActivity" 
          android:noHistory="true">
</activity>

在您的Activity

上按下
@Override
protected void onBackPressed() {
    if (this.isFinishing()){ 
        finish();
        super.onBackPressed();
    }
}

答案 4 :(得分:3)

我知道这是一个老帖子。但是这对我来说可能是有帮助的,就像我想要在他们的应用程序中实现相同的功能一样。

识别双背的解决方案可以通过计算两次背压之间的时间来完成。如果差异小于2秒(即2000毫秒),那么您可以接受双重按下并退出应用程序。否则显示Toast消息。

简单的实现方法是:

private static long back_pressed;

@Override
public void onBackPressed()
{
        if (back_pressed + 2000 > System.currentTimeMillis()) 
            super.onBackPressed();
        else 
            Toast.makeText(getBaseContext(), "Press once again to exit!",Toast.LENGTH_SHORT).show();

        back_pressed = System.currentTimeMillis();
}

可以在此link

中找到代码

答案 5 :(得分:2)

您可以在活动中覆盖onBackPressed()并在其中执行任何操作。以下是按下后退时退出应用程序的代码:

@Override
public void onBackPressed(){
  Intent intent = new Intent(Intent.ACTION_MAIN);
  intent.addCategory(Intent.CATEGORY_HOME);
  intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  startActivity(intent);
}

答案 6 :(得分:2)

您所要求的似乎会破坏后退按钮的目的和应用程序的预期流程。用户希望按下后退按钮将它们返回到上一个活动屏幕。

如果要使用后退按钮终止整个应用程序,每次使用startActivity()时都会调用finish()。这会在您离开时关闭当前活动,因此如果用户按下后退按钮,他们将离开您的应用。

答案 7 :(得分:2)

不要覆盖后退按钮行为,而应考虑使用FLAG_ACTIVITY_CLEAR_TOP intent标志来控制应用程序的活动堆栈。

  

如果已设置,并且正在启动的活动已在当前任务中运行,则不会启动该活动的新实例,而是将关闭其上的所有其他活动,并将此Intent传递给(现在在最前面)作为新意图的旧活动。

     

例如,考虑一个由活动组成的任务:A,B,C,D。如果D调用带有解析为活动B组件的Intent的startActivity(),那么C和D将完成并且B接收给定的Intent,导致堆栈现在为:A,B。

使用上面的例子。它将实现如下: 从活动D:

Intent intent = new Intent(context, B.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

答案 8 :(得分:2)

首先,你想要关闭你的应用程序是完全奇怪的,因为通常如果用户离开你的应用程序,android处理其余的应用程序,并根据设备的内存状态决定是关闭还是保持暂停状态一个完美的工作,这意味着你不应该担心它。

但是如果你想关闭你的应用程序,万一只有一个活动正在运行(在你的情况下按下后退按钮)关闭该活动将关闭整个应用程序。我的意思是,如果您使用意图传输到当前活动并且未关闭之前的活动,则使用this.finish()仅关闭当前活动并返回上一个暂停的活动,否则它将关闭整个应用程序。 考虑一个活动可能使用fragmet并且片段可以没有布局的事实。然后看起来应用程序在它仍在运行时关闭。

但如何使用硬件返回键来完成工作?你需要这样做

@Override
public void onBackPressed()
{
    if(/* check a condition to make sure you are in that certain activity */)
    {
        Process.killProcess(Process.myPid()); 
    }
    else
    {
        super.onBackPressed();
    }
}
祝你好运

答案 9 :(得分:1)

我使用此方法在Back press上留下一个应用程序:

@Override
public void onBackPressed() {
enter code here
    finish();
}

答案 10 :(得分:0)

你可以通过覆盖后退按钮来实现任何目标。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        // Do whatever you want with your activity
        // And for closing the whole app, you can use System.exit() which is absolutely not recomended
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

答案 11 :(得分:0)

@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) {
                 Intent intent = new Intent(Intent.ACTION_MAIN);
                  intent.addCategory(Intent.CATEGORY_HOME);
                  intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                  startActivity(intent);
             }
         }).setNegativeButton("No", null).show();

    }

答案 12 :(得分:0)

这是一个现成的方法来管理backPressed(),一次按两次并调用确认对话框:

/**
 * Overrides Back Pressed Button handler.
 * Single continuous press custom clear in your activity.
 * Double continuous press - confirmation dialog to close all activities and exit to Android.
 */
@Override
public void onBackPressed() {

if (isBackPressedTwice) {

  new AlertDialog.Builder(this)
    .setCancelable(false)
    .setIcon(
      R.drawable.exit)
    .setTitle(
      getString(
        R.string.exit))
    .setMessage(
      getString(
        R.string.close_application))
    .setNegativeButton(
      getString(
        R.string.no),
      null)
    .setPositiveButton(
      getString(
        R.string.yes),
      new DialogInterface.OnClickListener() {
        @Override
        public void onClick(
          DialogInterface dialog,
          int which) {

          finishAffinity();

          return;
        }
      })
    .show();
} else {
  // Custom activity clearing operations.
}

this.isBackPressedTwice = true;

new Handler().postDelayed(
  new Runnable() {
    @Override
    public void run() {

      isBackPressedTwice = false;
    }
  },
  1000);
}

答案 13 :(得分:0)

您可以在onBackPressed()方法中使用moveTaskToBack()退出应用。

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

希望这会有所帮助,

谢谢