【问题标题】:System.exit(0) doesnt close all my activities?System.exit(0) 不会关闭我的所有活动?
【发布时间】:2013-05-10 11:05:18
【问题描述】:

我有 2 个活动,所以活动 1 转到活动 2,然后在活动 2 上我有一个退出按钮。但是当我点击它时,它只退出了活动2并再次返回活动1。它基本上感觉就像我刚刚再次启动应用程序。不知道为什么?

这是我的代码。

Button btExit = (Button) findViewById(R.id.btExit);
    btExit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();
            System.exit(0);
        }
    });

【问题讨论】:

  • 在您的 Activity1 中的 startActivity(Activity2) 之后调用 finish()。
  • stackoverflow.com/questions/2033914/…。建议不要使用 System.exit(0);
  • @Anukool 如果用户按返回键而不是按钮将不起作用。
  • @MaciejGórski :是的,你是对的。
  • 实现此目的的最佳方法是stackoverflow.com/questions/3226495/…(在其中一个答案中提到)。或者您可以使用 MaciejGórski 的建议,使用 startActivityForResult() 从 ActivityA 调用 ActivityB。

标签: android android-activity


【解决方案1】:
System.exit(0);

是终止 android 应用程序的坏方法。 Android 在自己的操作系统中管理它

你可以通过对应的Intent调出Home应用:

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

希望对你有帮助

编辑:-

那么我想你的目标是完成所有堆积的活动..

这里是:-

关闭之前的所有活动如下:

Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("Exit me", true);
startActivity(intent);
finish();

然后在 MainActivity onCreate() 方法中添加这个来完成 MainActivity

if( getIntent().getBooleanExtra("Exit me", false)){
    finish();
}

结果将与上面相同,但由于您所有堆积的活动都已关闭,因此当您返回应用程序时,它必须从您的主要活动开始,即启动器活动。

希望这会有所帮助。

【讨论】:

  • @MaciejGórski 启动 HOME 应用程序(或使用 moveTaskToBack())不会更改此任务的当前状态。这意味着,使用这个例子,当用户从主屏幕再次启动这个应用程序时,它会将现有任务(包含 Activity1 和 Activity2)带回前面并显示用户 Activity2(这可能是 not OP 想要发生的事情。
  • @DavidWasser 我知道这一点。这就是为什么我的答案不同。我的评论是为了简化 CRUSADER 和 Nunu 的回答。
  • 十字军。我尝试了你的代码,它确实让我退出了我的应用程序,但它并没有关闭它,当我再次使用它时......它又回到了我离开它的地方......你也能克服这个吗?
  • read the post澄清你的概念
  • 此方法将重新启动您的 MainActivity.class 。检查stackoverflow.com/a/26258455/609782
【解决方案2】:

不要使用System.exit

如果您希望用户从任何Activity 关闭应用程序,我建议使用startActivityForResult,在第一个Activity 中检查onActivityResult 中的返回值并在那里调用finish()

【讨论】:

  • 为什么? finish 不会关闭应用程序,仅关闭活动。各位,请尝试理解我们还有许多其他类不是从 Activity 派生的。它们可用于自动化数据库连接、存储登录 ID、用户名、最后查询结果......因此关闭活动并不能解决生产环境中的问题。 Aaa, cześć Maciek ;)
【解决方案3】:

您可以模拟点击主页按钮:

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

但这不会关闭应用程序..

要关闭它,你可以像https://stackoverflow.com/a/9735524/1434631那样做

【讨论】:

  • 启动 HOME 应用程序不会更改此任务的当前状态。这意味着,使用此示例,当用户从主屏幕再次启动此应用程序时,它将把现有任务(包含 Activity1 和 Activity2)带回前面并显示用户 Activity2(这可能不是 OP 想要的发生。链接的解决方案更好。
【解决方案4】:

使用
finishAffinity(); 退出应用程序。

finish() 只会从活动堆栈中清除活动。

【讨论】:

    【解决方案5】:

    System.exit(0) 不适用于关闭应用程序

      ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
        am.killBackgroundProcesses("com.root.abc");
        
        System.runFinalizersOnExit(true);
        System.exit(0);
    
    
    add Manifest permission
    <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
    

    【讨论】:

      【解决方案6】:

      使用 finish() 和一个 sharedPreference 标志并在您单击按钮时设置该标志。在您的其他活动中,如果设置了标志,请检查标志并完成()它

      【讨论】:

        【解决方案7】:

        在传递开始下一个活动的意图后,通过在按钮点击上调用finish(); 来完成第一个活动。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-28
          • 1970-01-01
          • 1970-01-01
          • 2014-08-18
          • 2019-04-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多