9

我希望我的 android 应用程序的用户在他们按下某个活动时离开我的应用程序。这可以做到吗?

4

14 回答 14

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);
}
于 2013-07-25T08:37:53.530 回答
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 退出应用程序。一种更“正确”的方式可能是在后按时广播一个意图,并且如果您的应用程序的活动收到该意图,则它们会自行完成。

于 2013-07-25T08:37:40.083 回答
6

你可以试试这个

public void onBackPressed() {
    moveTaskToBack(true);
}
于 2013-07-25T08:41:20.337 回答
5

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

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

在您的后按Activity

@Override
protected void onBackPressed() {
    if (this.isFinishing()){ 
        finish();
        super.onBackPressed();
    }
}
于 2013-07-25T08:44:22.747 回答
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();
}

代码可以在这个链接中找到

于 2014-03-04T10:27:39.697 回答
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);
}
于 2013-07-25T08:39:01.413 回答
2

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

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

于 2013-07-25T08:41:42.200 回答
2

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

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

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

使用上面的例子。它将像这样实现:从活动 D:

Intent intent = new Intent(context, B.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
于 2013-07-25T08:53:37.607 回答
2

首先,您想要关闭您的应用程序是完全奇怪的,因为通常如果用户离开您的应用程序,android 会处理其余部分,并根据设备的内存状态决定关闭或暂停它,它做得很好在它上面,这意味着你不应该担心它。

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

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

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

祝你好运

于 2013-07-25T09:05:35.560 回答
1

我使用这种方法在 Back press 上留下应用程序:

@Override
public void onBackPressed() {
enter code here
    finish();
}
于 2013-07-25T08:55:00.007 回答
1

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

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

希望这可以帮助,

谢谢

于 2019-10-11T20:53:19.490 回答
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);
}
于 2013-07-25T08:35:11.770 回答
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();

    }
于 2016-07-06T06:37:59.120 回答
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);
}
于 2017-07-03T05:06:38.180 回答