如何以编程方式强制停止我的 android 应用程序?

Posted

技术标签:

【中文标题】如何以编程方式强制停止我的 android 应用程序?【英文标题】:How to force stop my android application programmatically? 【发布时间】: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)时,它会异常停止,看起来像是完全完成,并且“强制停止”按钮看起来已禁用。

【问题讨论】:

别这样。在这里阅读原因:***.com/questions/2033914/… 为什么需要这样做?最佳实践是让操作系统管理应用程序生命周期,包括进程死亡。 这完成了 Activity 而不是应用程序。 How to force stop an Android app的可能重复 【参考方案1】:

另一种方法是

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

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

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

【讨论】:

不推荐使用此功能的原因之一是,如果用户切换回应用程序,应用程序启动速度会更快。真的,无缘无故终止进程只是不好的做法。 我想强制停止其他应用程序。此方法无效。 @AndroidDeveloper - 关于杀死另一个应用程序,请参阅this question。 这不是一个好的选择。 Google 建议不要这样做。使用以下解决方案:***.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?

【讨论】:

以上是关于如何以编程方式强制停止我的 android 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 中以编程方式强制重启/重新加载 Playback 设备?

以编程方式强制关闭应用程序

在 Android 设备上以编程方式获取 CPU 时钟速度?

如果我强制停止应用程序,GCM 会收到推送通知

如何以编程方式启动和停止歌曲? [重复]

应用程序运行时如何在android中以编程方式关闭通知?