【问题标题】:How to exit an Android app programmatically?如何以编程方式退出 Android 应用程序?
【发布时间】:2023-03-29 20:44:01
【问题描述】:

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

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

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

【问题讨论】:

标签: java android eclipse android-activity


【解决方案1】:

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

来源:How to quit android application programmatically


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

【讨论】:

  • 不要使用 System.exit()。退出后,Android 将尝试重新启动应用程序。你可能会陷入循环。
【解决方案2】:

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

将此代码添加到 onclick 事件中:

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

【讨论】:

  • 这实际上并没有像 PeakGen 要求的那样“完全关闭应用程序”,因为应用程序仍在运行,但它是一个不错的选择
  • 我不这么认为,如果一个活动以 FLAG ACTIVITY NEW TASK 开始,这种方式无法退出
【解决方案3】:

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

                }
            });

【讨论】:

  • 它只是带我去第一个活动
  • @AnchitMittal System.exit(1) 不能保证重置 Activity 堆栈或任务(请参阅developer.android.com/guide/components/…)。因此,这种方法不能保证在适当的时候正确关闭应用程序(销毁所有活动)。
  • 并非所有活动都退出。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:
     @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();
        }
    

    【讨论】:

    • System.exit(1); 之间有什么不同;和 System.exit(0);
    • System.exit(1) 表示应用程序结束时出现了一些错误,而 System.exit(0) 表示应用程序结束时没有任何错误。这就是各种 linux/unix 命令在退出时返回(错误)条件的方式。
    【解决方案6】:

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

    【讨论】:

    • 哈哈哈。不太容易
    【解决方案7】:

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

    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 MyPid() 是 Process 类的一个方法,它返回这个进程的标识符,可以与 killProcess(int) 和 sendSignal(int, int) 一起使用
    • 它会停止后台服务和广播接收器,还是只是安全地关闭应用程序?
    • 那么,android.os.Process.killProcess(android.os.Process.myPid()); process.KillProcess(Process.MyPid()); 有什么区别?
    【解决方案8】:

    this.finishAffinity()怎么样

    来自文档,

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

    【讨论】:

      【解决方案9】:
      android.os.Process.killProcess(android.os.Process.myPid());
      

      【讨论】:

      • 就我而言,这救了我的命。谢谢!
      【解决方案10】:

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

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

      【讨论】:

      • 解释您为什么发布此代码作为答案以及它的作用。
      • 欢迎来到 Stack Overflow!虽然您可能已经解决了这个用户的问题,但纯代码的答案对于将来遇到这个问题的用户来说并不是很有帮助。请编辑您的答案以解释为什么您的代码解决了原始问题。
      【解决方案11】:
       @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);
          }
      

      【讨论】:

        【解决方案12】:

        在 Xamarin.Android 中实现:

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

        【讨论】:

        • 这是对 System.Environment.Exit 还是 Android.OS.Environment.Exit 的引用?
        【解决方案13】:
        Intent homeIntent = new Intent(Intent.ACTION_MAIN);
        homeIntent.addCategory( Intent.CATEGORY_HOME );
        homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(homeIntent);
        System.exit(1);
        

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

        【讨论】:

          【解决方案14】:

          把这个放到你的 onClic 中:

          moveTaskToBack(true);
              finish()
          

          【讨论】:

          • 被否决的人有什么问题。这就是答案。我有 2 个活动,第一个是 loginactivity,第二个是 mainactivity....我想在 mainactivity 中退出应用程序,不想回到 loginactivity...我插入这个答案,现在我可以在 mainactivity 中关闭应用程序。
          • 如果您这样做,应用程序仍将在后台运行
          • 工作正常。我的情况是:splashActivity 运行 MainActivity。当用户按下 MainActivity 应用程序按预期退出时。所有其他情况都让我回到了启动活动!
          • 好吧,您应该在登录完成后立即完成登录活动:) 答案当然是不完全正确movewTaskToBack 没有完成它只是 隐藏应用程序,其他人提到的finish 仅完成当前的activity。因此,它会退出当前活动并隐藏其余活动(如果有的话)。无论如何,它不应该仅仅为此而投反对票......
          【解决方案15】:

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

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

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

          阅读此问题以获得更清晰的信息 android - exit application code

          【讨论】:

            【解决方案16】:

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

            希望对你有帮助....:)

            【讨论】:

              【解决方案17】:

              只需调用这两个函数

               finish();
               moveTaskToBack(true);
              

              【讨论】:

              • 您的回答来自质量较低的帖子。即使您的代码是不言自明的,也请提供一些解释。
              【解决方案18】:

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

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

              【讨论】:

                【解决方案19】:

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

                【讨论】:

                  【解决方案20】:

                  仅使用 moveTaskToBack(true); 即可工作

                  【讨论】:

                    【解决方案21】:

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

                    【讨论】:

                      【解决方案22】:
                      finish();
                       finishAffinity();
                       System.exit(0);
                      

                      为我工作

                      【讨论】:

                      • 请在您的代码中添加一些解释。此外,看起来其他答案已经涵盖了 - 所以您还应该解释是什么让您的解决方案比其他解决方案更好
                      【解决方案23】:

                      如果有人仍然想知道,对于 Xamarin.Android(在我的情况下,Monogame 也在其上运行)Activity 上的命令 FinishAndRemoveTask() 做得很好!

                      【讨论】:

                        【解决方案24】:

                        在片段中

                        getActivity().finishAndRemoveTask();

                        在活动中

                        finishAndRemoveTask();

                        【讨论】:

                          【解决方案25】:

                          就这样称呼吧:

                          finishAffinity();
                          

                          【讨论】:

                          • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
                          【解决方案26】:

                          只需在你的后台使用代码

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

                          【讨论】:

                            【解决方案27】:

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

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

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

                            【讨论】:

                              【解决方案28】:

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

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

                              【讨论】:

                                【解决方案29】:

                                这个可以,我也试过了。

                                this.finishAffinity();

                                【讨论】:

                                  【解决方案30】:

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

                                  完成();

                                  System.exit(0);

                                  【讨论】:

                                    猜你喜欢
                                    • 2011-09-13
                                    • 1970-01-01
                                    • 2011-10-22
                                    • 2017-12-19
                                    • 2011-02-18
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    相关资源
                                    最近更新 更多