如何以编程方式退出Android应用程序?


92

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

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

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


为什么不使用操作栏。单击应用程序图标导航到主屏幕。单击
后退

@Raghunandan:正如我提到的,客户要求:(
柠檬汁

检查是否有帮助android.os.Process.killProcess(android.os.Process.myPid());
SANorton Stanley


Answers:


71

实际上,每个人都希望在onclick事件上关闭应用程序,无论它在哪里活动。

因此,朋友们请尝试此代码。将此代码放在onclick事件上

Intent homeIntent = new Intent(Intent.ACTION_MAIN);
    homeIntent.addCategory( Intent.CATEGORY_HOME );
    homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
    startActivity(homeIntent); 

8
实际上,这不会像PeakGen那样“完全关闭应用程序”,因为该应用程序仍在运行,但这是一个不错的选择
La masse

2
我不这样认为,如果一项活动以“标记活动新任务”开始,则这种方式无法退出
fozua

51

您可以调用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);

                }
            });

5
这只是带我去参加第一项活动
柠檬汁

8
@AnchitMittal System.exit(1)无法保证重置Activity堆栈或任务(请参阅developer.android.com/guide/components/…)。因此,这种方法不能保证在适当的时候正确关闭应用程序(销毁所有活动)。
IgorGanapolsky 2014年

并非所有活动都退出。
Jitendra

48

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应用程序


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


2
不要使用System.exit()。退出后,Android将尝试重新启动该应用程序。您可能会陷入循环。
AndroidDev

42

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

public void onBackPressed() {
  moveTaskToBack(true);
  android.os.Process.killProcess(android.os.Process.myPid());
  System.exit(1);
}

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

4
System.exit(1)之间有什么不同?和System.exit(0);
Pyae Phyo

System.exit(1)表示应用程序完成时出现了一些错误,而System.exit(0)表示应用程序完成时没有任何错误。这就是各种linux / unix命令在退出时返回(错误)条件的方式。
iOS编码器


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

Mypid()是您的方法还是什么……所以,您如何编写Mypid ...您必须使用方法来编写....
Amitsharma 2014年

@amitsharma MyPid()是Process类的一种方法,该方法返回该进程的标识符,该标识符可与killProcess(int)和sendSignal(int,int)一起使用
Kasun

它会同时停止后台服务和广播接收器,还是会安全关闭该应用程序?
Usman Rana

那么,android.os.Process.killProcess(android.os.Process.myPid()); 和之间有什么区别process.KillProcess(Process.MyPid());
DysaniazzZ

7

怎么样 this.finishAffinity()

从文档中

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


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

就我而言,这挽救了我的生命。谢谢!
利夫卡

4

这将清除Task(活动堆栈)并开始新的Task

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);

说明您为什么将此代码发布为答案以及它的作用。
M. Adeel Khalid

1
欢迎使用Stack Overflow!尽管您可能已经解决了该用户的问题,但是仅代码的答案对以后遇到此问题的用户不是很有帮助。请编辑您的答案以解释您的代码为何能解决原始问题。
Joe C

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

2

将此放入您的onClic:

moveTaskToBack(true);
    finish()

被低票的人怎么了?这就是答案。我有2个活动,第一个是loginactivity,第二个是mainactivity...。我想退出mainactivity内的应用程序,但又不想回到loginactivity ...我插入了这个答案,现在我可以在mainactivity中关闭该应用程序了。
阿齐兹·穆萨

如果执行此操作,则应用程序仍将在后台运行
Mohanad Haddadin 2015年

工作正常。我的情况是:splashActivity运行MainActivity。当用户按下MainActivity时,应用程序将按预期方式退出。所有其他情况都让我回到了启动活动!
Jviaches

好了,您应该在登录完成后立即完成登录活动:)当然,答案并不完全正确movewTaskToBack什么也没有完成,只是隐藏了应用程序,finish正如其他人所提到的,仅完成了当前操作activity。因此,它退出当前活动并隐藏其余的活动(如果有)。无论如何,它不应该只为此投票……
猫喵2012年

2

在通话中尝试一下。我有时在按钮的onClick中使用它。

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

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

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


2

使用this.finishAffinity(); 在该按钮上而不是finish(); 如果不起作用,您也可以尝试在清单中添加android:noHistory =“ true”,然后通过uisng finish()完成活动。或finishAffinity();

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


2

在Xamarin.Android中实现:

    public override void OnBackPressed()
    {
        MoveTaskToBack(true);
        Process.KillProcess(Process.MyPid());
        Environment.Exit(1);
    }

这是对System.Environment.Exit还是Android.OS.Environment.Exit的引用?
莫芬

2

只需调用这两个函数

 finish();
 moveTaskToBack(true);

您的回答来自质量较低的帖子。即使您的代码是自我解释的,也请提供一些解释。
Harsha Biyani

2
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory( Intent.CATEGORY_HOME );
homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(homeIntent);
System.exit(1);

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


我这样做了,然后从5楼扔了电话,所有活动都关闭了thanx
Paschalis

1

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



1

代替System.exit(1)只需使用System.exit(0)


1

如果仍然有人怀疑,那么对于Xamarin.Android(在我的情况下也是在其FinishAndRemoveTask()上运行Monogame),该命令Activity执行得很好!



0

只需在backpress中使用代码

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

0

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

final public class KillItWithFireEvent
{
    public KillItWithFireEvent() {}

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

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


0

要退出应用程序,只需运行以下两行

android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);

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

为我工作


1
请在您的代码中添加一些说明。此外,看来其他答案已经涵盖了这一点-因此,您还应该解释使您的解决方案比其他解决方案更好的原因
Nico Haase

0

只需致电:

finishAffinity();

尽管此代码可以回答问题,但提供有关此代码为何和/或如何回答问题的其他上下文,可以提高其长期价值。
Igor F.

0

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

public void quitGame(View view) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            finishAndRemoveTask();
        } else {
            finish();
        }
    }

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.