【问题标题】:How to force stop my android application programmatically?如何以编程方式强制停止我的 android 应用程序?
【发布时间】:2011-07-03 07:28:41
【问题描述】:

我想在单击 closeButton 时强制停止我的 Android 应用程序。这是我的代码。

protected void onCreate(Bundle savedInstanceState) {

  this.setContentView(R.layout.layoutxml);

  this.closeButton = (Button)this.findViewById(R.id.close);

  this.closeButton.setOnClickListener(new OnClickListener() {

    @Override

    public void onClick(View v) {

      finish();

    }

  });

}

这完成了我的申请。如果我转到Settings -> Applications -> Manage applications -> <my application name>,我可以看到“强制停止”按钮已启用。这是否意味着我的应用程序没有完全停止?

如何才能完全完成我的 Android 应用程序并禁用“设置”中的“强制停止”按钮?根据我有限的经验,当应用程序中发生“异常”(例如 NullPointerException)时,它会异常停止,看起来像是完全完成,并且“强制停止”按钮看起来已禁用。

【问题讨论】:

标签: android forceclose termination


【解决方案1】:

另一种方法是

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

我认为这样做并没有那么糟糕,只要您将这些电话放在onDestroy() 中即可。 (如果您在事件处理过程中终止进程,则可能会发生各种不好的事情——比如触摸焦点进入以太。)

尽管如此,您需要一个令人信服的理由来偏离最佳实践,即只需调用 finish() 并让操作系统在需要时/如果需要时关闭您的进程。

【讨论】:

  • 不推荐使用此功能的原因之一是,如果用户切换回应用程序,应用程序启动速度会更快。真的,无缘无故终止进程只是不好的做法。
  • 我想强制停止其他应用程序。此方法无效。
  • @AndroidDeveloper - 关于杀死另一个应用程序,请参阅this question
  • 这不是一个好的选择。 Google 建议不要这样做。使用以下解决方案:stackoverflow.com/a/34340126/2349947
  • 感谢您的解释,@Ted Hopp。现在我明白你的意思了。谢谢
【解决方案2】:

注意:这不会杀死整个应用程序,但如果您想要完成所有应用程序活动,这是最佳选择。

Android ≥ 16

finishAffinity();

安卓

ActivityCompat.finishAffinity(Activity activity)

希望对你有帮助

【讨论】:

  • 这只是在多个活动上同时调用“finish()”的一种方式。这仍然不会杀死应用程序本身。
  • 你是对的!我将在答案中提到这一点
  • @Vinoth Vino 很高兴它有帮助
  • 我发现这个答案解决了我在 android.os.Process.killProcess(pid) 对我不起作用时反应原生 0.38 和反应原生路由器通量 3.38.0 的问题;它导致应用程序再次重新打开。谢谢!
【解决方案3】:

杀死应用程序的不好方法是System.exit(0)

编辑: 我相信我欠一些解释。 Android 自己处理应用程序生命周期,您不应该“强制关闭”它,而且我不知道有什么好的方法。通常,如果您的应用程序在后台仍然存在,则可以,这样如果用户再次启动它,它会很快弹出。

【讨论】:

  • 如果我想处理一个异常(比如没有检测到网络!!)然后在应用程序的顶部更进一步......因为当代码的其他部分开始使用他们抛出的 http 结果时nullpointerexceptions 但我不想让代码到达那里!我想显示一个警告对话框,让用户知道错误并关闭应用程序,因为简单地处理异常仍然保持应用程序打开.....我该怎么办????
  • @Shark - 如果您的程序在捕获异常后继续执行,则问题出在您的错误处理例程上。如果抛出异常,“代码的其他部分”永远不应该尝试使用 http 结果。由于异常而终止应用程序是一种非常糟糕的编程方法......但它真的很快。我认为您可以为此提出一个单独的问题。
  • 我在上面睡了一觉,冷静了一点,答案很明确!以我现在想要的方式工作,而无需强制终止应用程序。是的,这是我使用的一些糟糕而愚蠢的编码......修复了这个问题:)我对 Android 和 Java 非常陌生,事实上......需要时间来弄清楚基础知识:P @m0s 谢谢!
【解决方案4】:

我知道回复晚了,希望对大家有所帮助。

你可以在你的 sn-p 中尝试finishAndRemoveTasks(); 而不是finish();

这会杀死您的应用程序的所有活动和所有进程,甚至从任务管理器中删除最近的应用程序。

注意:如果您在代码中使用了任何类型的handlerthread,请确保删除其功能,然后使用上面建议的代码,否则会出现NullPointer ExceptionResourceNotFound Exception

【讨论】:

  • 这不会关闭应用程序的进程。除非进程消失,否则静态数据、应用程序组件和分配给动态加载库的内存等不会被释放。
【解决方案5】:

短小精悍

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

【讨论】:

    【解决方案6】:

    为什么不对 ActivityManager 进行 Shell-Call?

    try {
          Runtime.getRuntime().exec("am force-stop com.me.myapp");
        } catch (IOException e) {
          e.printStackTrace();
        }
    

    【讨论】:

    • 因为您需要 root 访问权限?
    【解决方案7】:

    下面的链接有解决方案。 它对我有用。

    finishAffinity()
    

    How to force stop my android application programmatically?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 1970-01-01
      相关资源
      最近更新 更多