首页 > 开发 > Android > 正文

为什么调用Process.killProcess API不好?

2017-09-08 15:24:09  来源:网友分享

我读过一些文章都说用这个方法“不好”,这不是正确的关闭程序的方式,这不是Android的工作方式...
我理解并接受Android操作系统比我更清楚应该何时终止进程,但我并没有听说过一个比较好的解释,为什么使用killProcess()是错误的方法?毕竟 - 这是androidAPI的一部分...
比方说,调用此方法时,可能其他线程在做一些重要操作(文件操作,写入数据库,HTTP请求,正在运行的服务..)强行终止,显然不是很好。又比方说“重新打开”应用程序会更快,系统可能仍然“持有”某种记忆状态,killProcess()也会杀掉这些好处。

除了这些原因,假如我不需要这些操作,我不在乎应用程序每次重新加载,还有为什么不使用killProcess()方法的其它原因?
我知道finish()方法来关闭一个Activity,所以不要给我说finish()只针对Activity。并非整个应用程序,我想我知道为什么以及何时使用它...
另外-我正在开发的游戏,用到了Unity3D框架,最终导出项目到Android。当我反编译生成APK,我惊讶地发现,unity中创建的Java源代码- Application.quit()方法,用到Process.killProcess(Process.myPid()) 。
根据Unity3D的开发指南,是不是可假定Application.quit()是关闭游戏的正确方式(是不是真的?也许我错了,错过了一些东西),所以它是如何发生?unity框架似乎能比较好的工作,是乎在原生Android,执行了killProcess() ?

原问题:Why calling Process.killProcess(Process.myPid()) is a bad idea?

解决方案

1.来自@liorry 的回答:

谁说调用Process.killProcess(Process.myPid())是一个坏主意?
是的,让操作系统自己管理内存是(更快的再次打开等...)的最佳的开发实践。
但是,假如你确认不会打断线程或其他后台操作,并且在onDestroy()中调用 -我认为没有理由不应该使用它。它本身就是一个可供调用的API,而不是什么第三方的解决方案,而谷歌并没有在API文档中说最好不要使用它。


2. 来自@Nikolay Elenkov 的回答:

好吧,Unit3d是最有可能使用本机代码,并且为了保险起见他们会杀掉进程 - 因为他们不希望出现内存泄漏。不论这样做是好还是坏,他们使用这个方法,并不意味着你也应该这么做。
也许有一些极端的情况下,您需要使用killProcess() ,但通常操作系统会根据当前的负载,替你做了。不是很清楚你在寻找什么样的答案,我想你应该也知道,使用killProcess()有可能造成破坏,除非你明确清楚它的用法,否则最好不要使用它。


3.来自@Russ 的回答

在一个完美的世界,完美的代码和库,你不应该调用Process.killProcess(Process.myPid()) ,操作系统会正确地关闭你的应用程序。

最近我做的一个Android游戏,免费的版本中有Ad library,它会保持应用程序运行,造成内存泄漏。付费版本没有这个问题,因没有广告库。我的解决办法是在免费版的主菜单上添加退出按钮,它会执行上面那样的代码。大多数人会操作退出按钮,我不担心它吃内存。付费版本我仅仅是执行 finish() 。

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