Android:按返回键退出应用程序

39

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

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

你在这段代码上没有编译错误吗? - LightYearsBehind
13个回答

105

当按下返回键并完成当前活动(比如说 A)后,您会看到一个带有应用程序徽标(比如说 B)的空白活动。这意味着在完成 A 活动后显示的 B 活动仍然在后退堆栈中,并且 A 活动是从 B 活动中启动的。因此,在 A 活动中,您应该使用以下标志开始 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);

现在你的 Activity A 是栈顶上唯一的应用程序活动。

现在,在您想要实现 onBackPressed 关闭应用程序的 Activity 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);

        }

    }

这里的处理程序处理意外的后退操作,它只是显示一个Toast,如果在3秒内再次后退,则关闭应用程序。


我不知道我的应用程序中的“NEXT_ACTIVITY”是什么,我在我想要退出按钮在此页面工作的活动中添加了我的代码,但在您的代码中,我不知道哪个页面将是我的“NEXT_ACTIVITY”。 - Elham Gdz
优雅点。只是不确定Home.this是什么。我把它移除了,只留下finish(); - samleighton87
@samleighton87,不需要那个,只要完成就可以了。(Home是我的活动名称) - Rachit Mishra
有关Intent选项/标志等的文档,请参阅此处 - code_dredd

46

试一下这个:

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);的情况下进行手动重启。 - Ivan V
不良实践是从主页按钮杀死应用程序并使用System.exit(0);,我们必须在最后一个活动中单击返回按钮后保持系统杀死应用程序。 - Sofien Rahmouni

23

我有同样的问题,我有一个LoginActivity和一个MainActivity。 如果我在MainActivity中点击返回按钮,应用程序必须关闭。 因此,我使用OnBackPressed方法解决了这个问题。moveTaskToBack()与Home Button的工作方式相同。它保留Back stack。

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

}

2
绝妙的解决方案。赞! - Vijay Kumar Kanta

5

这意味着在启动此活动时,您的堆栈中存在先前的活动。在调用此活动的行之后添加finish();

在您的所有先前活动中,当您启动新活动时,例如:

startActivity(I);

在此之后添加finish();

3

我理解谷歌希望 Android 负责内存管理和关闭应用程序。如果必须从代码中退出应用程序,向 Android 请求运行垃圾回收器可能会有益。

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

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


2

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


1
这个对我有用。我通过结合其他答案自己发现了它。
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);
}

1
为了在按下返回按钮时退出应用程序,您必须首先清除所有顶部活动,然后启动Android手机的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);
    }

1

Finish并不关闭应用程序,它只是关闭活动。如果这是启动器活动,则会关闭您的应用程序;如果不是,则会返回到上一个活动。

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


请检查编辑,我想让我的应用程序在关闭时在后台运行,我该怎么做? - Elham Gdz
@ElhamGdz,您能否重新表达一下您的句子?我无法理解您的意思。如果您查看Activity生命周期,就会发现没有“在后台运行”的状态,它要么正在运行,要么未运行。http://developer.android.com/training/basics/activity-lifecycle/index.html。如果您想在后台运行一些代码,则可能需要使用Async或(作为最后一种选择)Service http://developer.android.com/reference/android/app/Service.html。 - gian1200

1
尝试这个。
Intent a = new Intent(Intent.ACTION_MAIN);
a.addCategory(Intent.CATEGORY_HOME);
a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(a);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接