29

我读过一些帖子,说使用这种方法“不好”,不应该使用,这不是“关闭”应用程序的正确方法,也不是 Android 的工作方式......

我理解并接受 Android 操作系统比我更清楚何时终止进程的正确时间这一事实,但我还没有听到关于为什么使用该killProcess()方法是错误的很好的解释。毕竟 - 它是 Android API 的一部分。

我所知道的是,在其他线程正在执行潜在的重要工作(文件操作、写入数据库、HTTP 请求、运行服务..)时调用此方法会导致线程被终止,这显然不好。另外,我知道我可以从“重新打开”应用程序会更快的事实中受益,因为系统从上次使用应用程序时仍然“保持”在内存状态,并killProcess()防止这种情况发生。

除了这个原因,假设我没有这样的操作,并且我不在乎我的应用程序是否每次打开它都会从头开始,还有其他原因我不应该使用该killProcess()方法吗?

我知道finish()关闭 an 的方法Activity,所以请不要在你的答案中包含它。

finish()仅适用于Activity,并非适用于所有应用程序,我想我确切地知道为什么以及何时使用它。

还有一件事——我正在使用 Unity3D 框架开发游戏并将项目导出到 Android。当我对生成的apk进行反编译时,我很惊讶地发现从unity-实现Unity的-Application.quit()方法创建的java源代码,带有Process.killProcess(Process.myPid()).

Application.quit()根据 Unity3D 文档,应该是关闭游戏的正确方法(真的吗?也许我错了,错过了什么),那么为什么 Unity 的框架开发人员要在原生 Android 中实现这一点?

4

6 回答 6

15

<rant>

在一个完美的世界中,拥有完美的代码和库,您不需要调用Process.killProcess(Process.myPid()),操作系统会在适当的时候正确地终止您的应用程序。中东也将和平,猪会飞,停顿问题将得到解决。

因为所有这些事情都还没有发生,所以有时你需要执行这样的“禁止”代码。

我最近制作的一款 Android 游戏,免费版本使用了一个广告库,它可以让应用程序保持活动状态并且还会泄漏内存。付费版本没有这个问题,因为没有链接广告库。我的解决方案是在执行此类代码的主菜单上添加一个退出按钮。我希望大多数人在完成后会点击这个按钮,我不必担心它会占用内存。finish()我刚刚执行并完成的付费版本。(这是在谷歌应用内购买可用之前,所以我必须制作一个付费和免费版本,他们现在可能已经解决了这个问题,我可以更新所说的游戏,但它确实做得不太好,我怀疑花在它上面的任何时间都是值得的)

有点像在小学/中学他们告诉你你不能取负数的平方根。然后在更高级别的代数课上,他们说......好吧,你可以取负数的平方根,但你会得到奇怪的结果,但它是一致的并解决了问题。

换句话说,除非您知道自己在做什么,否则不要执行“禁止”代码。

</rant>

于 2012-06-23T19:11:39.307 回答
9

谁说调用 Process.killProcess(Process.myPid()) 是个坏主意?

是的,让操作系统管理自己的内存是您和使用您的应用程序的用户的最佳实践(更快地再次打开,更少的强制关闭机会等......)。

但是,假设您确定您没有中断线程或其他后台操作并且您使用此调用onDestroy()- 我认为您没有理由不使用它。尤其是当它是 API 调用而不是解决方法时,而且 Google 没有提到最好不要在 API 文档中使用它。

于 2012-06-18T11:38:59.550 回答
9

好吧,Unit3d 很可能使用的是本机代码,他们将终止进程作为保险——他们不想泄漏内存。您可以争论这是否是一个好主意,但他们使用它的事实并不意味着您也应该这样做。

也许在某些极端情况下您会想要使用killProcess(),但通常操作系统会根据当前负载和使用情况为您执行此操作。不知道你在寻找什么样的答案——你知道使用killProcess()可能会破坏事情,除非你能证明它的使用是合理的,否则不要使用它。

于 2012-06-15T06:05:22.080 回答
3

以下是killProcess会咬你而不按预期工作的两种情况:

  1. 粘性服务 - 即使您终止了该进程,它们也会自动重新启动

  2. Timer - 如果您安排线程在 Timer 上运行,它们将在终止进程后继续执行

因此,如您所见,在某些情况下killProcess不是清理正在运行的应用程序的谨慎解决方案。

于 2017-11-07T19:02:25.543 回答
0

在我看来,一些Android开发人员不推荐kill进程的原因是,如果你只是简单地杀死进程,很难确保所有的服务、活动都安全、正确地退出。对于一个APP开发者来说,他们的APP可能会与其他APP共享数据,一些Activity可能会导出给其他APP。如果您终止该进程,其他应用程序可能会出错。而且,在大多数情况下,您实际上不需要“杀死”应用程序,只需完成您正在做的和您不希望用户看到的工作,将其他工作留给Android系统。他们比我们更了解。好吧,如果你清楚你想做什么,不要关心打开速度快等等,比如你想在用户点击某个按钮时退出游戏,你的游戏当然不会导出到其他应用程序,也不会在外面分享数据你的游戏,可以这样做,只需小心确保没有其他服务或线程需要运行。在这种情况下,我建议在终止进程之前完成所有活动,以确保活动正确保存状态,我将调用类似:

    activity.finishAffinity();
    Process.killProcess(Process.myPid());

在当前活动中。这只是我的看法,欢迎指正。

于 2020-05-06T04:42:19.743 回答
0

这是个坏主意。一方面,您的活动不值得使用检测,因为这些框架在所有生命周期方法上注册,并且只有在干净执行后它们才会报告测试成功状态。如果您从测试应用程序下方终止该进程,它将报告失败,并且不清楚这是否正在发生。

于 2018-07-03T15:20:51.327 回答