113

我相信这个问题已经被问过很多次了,因为我读了一些。我的客户希望我在他的应用程序中放置一个按钮,用户可以点击并退出。我已经阅读了这篇文章,发现打电话finish()可以做到。但是,完成只是关闭当前正在运行的活动,对吗?我有很多活动,所以在这种情况下,我必须传递每个活动的实例并完成它们或将每个活动变成单例模式。

我还知道Activity.moveTaskToBack(true)可以让你进入主屏幕。好的,这不是关闭,而是在后台处理该过程。那么这有效吗?

我应该使用哪种方法来完全关闭应用程序?上述任何方法或上述方法的任何其他方法/其他用法?

4

30 回答 30

83

在 API 16 中发布的 finishAffinity 方法会关闭所有正在进行的活动并关闭应用程序:

this.finishAffinity();

在当前任务中完成此活动以及紧接其下的所有具有相同亲和力的活动。这通常在应用程序可以启动到另一个任务时使用(例如从它理解的内容类型的 ACTION_VIEW)并且用户已经使用向上导航切换出当前任务并进入它自己的任务。在这种情况下,如果用户向下导航到第二个应用程序的任何其他活动,则所有这些活动都应作为任务切换的一部分从原始任务中删除。

请注意,此完成不允许您将结果传递给先前的活动,如果您尝试这样做,则会引发异常。


从 API 21 开始,您可以使用:

finishAndRemoveTask();

完成此任务中的所有活动并将其从最近的任务列表中删除。

备择方案:

getActivity().finish();
System.exit(0);


int pid = android.os.Process.myPid();
android.os.Process.killProcess(pid);


Process.sendSignal(Process.myPid(), Process.SIGNAL_KILL);


Intent i = new Intent(context, LoginActivity.class);
i.putExtra(EXTRA_EXIT, true);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(i);

资料来源:如何以编程方式退出 android 应用程序


希望能帮助到你!祝你好运!

于 2016-10-25T04:16:12.760 回答
76

实际上,每个人都在寻找通过 onclick 事件关闭应用程序,无论活动在哪里......

将此代码添加到 onclick 事件:

Intent homeIntent = new Intent(Intent.ACTION_MAIN);
    homeIntent.addCategory( Intent.CATEGORY_HOME );
    homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
    startActivity(homeIntent); 
于 2014-04-09T11:12:15.377 回答
49

您可以调用 System.exit(); 摆脱所有的活动。

    submit=(Button)findViewById(R.id.submit);

            submit.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
android.os.Process.killProcess(android.os.Process.myPid());
                    System.exit(1);

                }
            });
于 2013-07-18T09:50:08.043 回答
45

如果要退出应用程序,请在按钮按下事件中使用此代码:

public void onBackPressed() {
  moveTaskToBack(true);
  android.os.Process.killProcess(android.os.Process.myPid());
  System.exit(1);
}
于 2015-09-14T18:38:19.257 回答
24
 @Override
    public void onBackPressed() {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
        alertDialogBuilder.setTitle("Exit Application?");
        alertDialogBuilder
                .setMessage("Click yes to exit!")
                .setCancelable(false)
                .setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                moveTaskToBack(true);
                                android.os.Process.killProcess(android.os.Process.myPid());
                                System.exit(1);
                            }
                        })

                .setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                        dialog.cancel();
                    }
                });

        AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.show();
    }
于 2014-06-05T10:18:29.013 回答
16

这太容易了。利用System.exit(0);

于 2013-12-05T19:43:03.433 回答
13

准确来说有两种可能的情况:

  1. 您可能想退出活动
  2. 或者您想退出应用程序

您可以使用以下代码退出活动:

var intent = new Intent(Intent.ActionMain);
intent.AddCategory(Intent.CategoryHome);
intent.SetFlags(ActivityFlags.NewTask);
startActivity(intent);
finish();

但这不会杀死同一应用程序中的底层活动。这只会最小化应用程序。

如果要退出应用程序,请使用以下代码结束其进程:

android.os.Process.killProcess(android.os.Process.myPid()); 

对于单声道开发,只需使用

process.KillProcess(Process.MyPid());
于 2014-02-05T12:00:23.627 回答
9

怎么样this.finishAffinity()

从文档中,

在当前任务中完成此活动以及紧接其下的所有具有相同亲和力的活动。这通常在应用程序可以启动到另一个任务时使用(例如从它理解的内容类型的 ACTION_VIEW)并且用户已经使用向上导航切换出当前任务并进入它自己的任务。在这种情况下,如果用户向下导航到第二个应用程序的任何其他活动,则所有这些活动都应作为任务切换的一部分从原始任务中删除。请注意,此完成不允许您将结果传递给先前的活动,如果您尝试这样做,则会引发异常。

于 2016-10-20T19:50:51.337 回答
6
android.os.Process.killProcess(android.os.Process.myPid());
于 2013-07-18T09:39:16.533 回答
4

这将清除任务(活动堆栈)并开始新任务

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
System.exit(1);
于 2017-02-25T11:05:40.750 回答
3
 @Override
    public void onBackPressed() {
        Intent homeIntent = new Intent(Intent.ACTION_MAIN);
        homeIntent.addCategory( Intent.CATEGORY_HOME );
        homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(homeIntent);
    }
于 2015-04-14T09:27:31.867 回答
3
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory( Intent.CATEGORY_HOME );
homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(homeIntent);
System.exit(1);

使用此代码非常有用,您可以退出所有活动。

于 2020-06-08T05:33:27.720 回答
3

在 Xamarin.Android 中实现:

    public override void OnBackPressed()
    {
        MoveTaskToBack(true);
        Process.KillProcess(Process.MyPid());
        Environment.Exit(1);
    }
于 2018-06-13T00:05:54.207 回答
2

把这个放到你的 onClic 中:

moveTaskToBack(true);
    finish()
于 2015-02-05T11:51:38.253 回答
2

只需调用这两个函数

 finish();
 moveTaskToBack(true);
于 2019-04-13T03:37:12.200 回答
2

打电话试试这个。我有时在按钮的 onClick 中使用它。

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

它不是关闭您的应用程序,而是打开仪表板,看起来您的应用程序已关闭。

阅读此问题以获得更清晰的 android - 退出应用程序代码

于 2015-09-18T19:24:05.540 回答
2

将此方法链接到您的退出/退出按钮

public void quitGame(View view) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            finishAndRemoveTask();
        } else {
            finish();
        }
    }
于 2020-05-22T12:34:31.620 回答
2

使用 this.finishAffinity(); 在那个按钮上而不是完成();如果它不起作用,那么您也可以尝试在清单中添加 android:noHistory="true" ,然后通过 uisng finish(); 完成您的活动;或完成亲和();

希望能帮助到你....:)

于 2018-03-19T10:52:58.733 回答
1

在 onCreate 上使用 singletop 和 finish() 调用的幽灵活动应该可以解决问题

于 2013-07-18T09:37:51.173 回答
1

如果有人仍然想知道,对于Xamarin.Android(在我的情况下也是 Monogame 在其上运行),命令FinishAndRemoveTask()onActivity可以很好地完成工作!

于 2019-01-26T12:12:31.207 回答
1

在片段中

getActivity().finishAndRemoveTask();

在活动中

完成AndRemoveTask();

于 2019-03-29T18:47:12.417 回答
1

而不是 System.exit(1) 只需使用 System.exit(0)

于 2018-01-16T09:05:29.493 回答
1

它仅使用moveTaskToBack(true);

于 2016-05-24T19:54:14.873 回答
1
finish();
 finishAffinity();
 System.exit(0);

为我工作

于 2019-01-17T06:04:27.963 回答
1

只需调用这个:

finishAffinity();
于 2020-03-11T07:12:23.643 回答
0

如果您在应用程序中使用EventBus(或任何其他 pub/sub 库)在活动之间进行通信,您可以向它们发送显式事件:

final public class KillItWithFireEvent
{
    public KillItWithFireEvent() {}

    public static void send()
    {
        EventBus.getDefault().post(new KillItWithFireEvent());
    }
}

唯一的缺点是你需要所有的活动来监听这个事件来调用自己的finish()。为此,您可以通过继承轻松创建shim活动类,该类只侦听此事件并让子类实现其他所有内容,然后确保您的所有活动都从这个额外的层继承。kill 监听器甚至可以通过覆盖添加一些额外的功能,比如在某些特定情况下避免死亡。

于 2016-11-16T11:08:14.157 回答
0

当您想退出应用程序时,只需运行以下两行

android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
于 2018-03-19T10:35:53.447 回答
0

只需在您的后台使用代码

                    Intent startMain = new Intent(Intent.ACTION_MAIN);
                    startMain.addCategory(Intent.CATEGORY_HOME);
                    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(startMain);
于 2016-02-27T05:45:07.167 回答
0

这可以工作我也试过了。

this.finishAffinity();

于 2021-02-01T15:22:29.643 回答
-1

如果您同时使用完成和退出,您的应用程序将完全关闭

结束();

System.exit(0);

于 2017-07-25T13:30:37.577 回答