为什么调用Process.killProcess(Process.myPid())是个坏主意?

Tal*_*nel 25 android kill-process unity-game-engine

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

我理解并接受这样一个事实,即在正确的时间终止这个过程时Android OS比我更清楚,但我没有听到一个很好的解释为什么使用这个killProcess()方法是错误的?毕竟 - 它是android API的一部分......

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

除了这个原因,假设我没有这样的操作,而且我不在乎我的应用程序会从头开始每次运行,还有其他原因为什么不使用这个killProcess()方法?

我知道关闭一个Activity的finish()方法,所以请不要写我这个... finish()仅供参考Activity.不是所有应用程序,我想我确切知道为什么以及何时使用它...

还有一件事 - 我正在使用Unity3D框架开发游戏,并将项目导出到android.当我反编译生成的apk时,我非常惊讶地发现java源代码是从Unity创建的 - 实现Unity的finish()方法,用Activity.

Application.quit()假设是根据Unity3d指南关闭游戏的正确方法(它真的吗?也许我错了,并且错过了一些东西),那么Unity的框架开发人员如何做得非常好,因为它似乎实现了这个原生android到Process.killProcess(Process.myPid())

Rus*_*uss 13

<rant>

在完美的世界中,使用完美的代码和库,您不需要调用Process.killProcess(Process.myPid()),操作系统将正确地杀死您的应用程序.中东也会有和平,猪会飞,停止问题也将得到解决.

因为所有这些事情还没有发生,有时你需要执行这样的'禁止'代码.

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

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

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

</rant>

  • 喜欢你的回答,但这有点像以更哲学的方式表达了 liorry 已经说过的话。我对“应用内购买”的故事有点失去了你,但得到了你最后的要点。我给你投了赞成票,因为你提出了一个有趣的观点.. (2认同)

Nik*_*kov 9

好吧,Unit3d最有可能使用本机代码,他们将这个过程视为一种保险 - 他们不想泄漏内存.你可以争辩这是不是一个好主意,但他们使用它的事实并不意味着你也应该这样做.

也许在某些极端情况下您会想要使用killProcess(),但通常操作系统会根据当前的负载和使用情况为您执行此操作.不确定你正在寻找什么样的答案 - 你知道使用killProcess()可能会破坏东西,除非你可以证明它的用法,不要使用它.


Lio*_*luz 8

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

是的,让操作系统管理自己的内存对于您和使用您的应用程序的用户来说都是最佳做法(再次打开速度更快,关闭力量的机会更少等等).

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

  • "谁说调用Process.killProcess(Process.myPid())是一个坏主意?" - 核心Android开发团队,尤其是像Dianne Hackborn和Romain Guy这样的工程师. (14认同)
  • 这就像说"癌症致死"和"被枪杀73次"等同.是的,最终结果是一样的.不,你到达那里的方式有很大不同.值得注意的是,您提到的其他内容还有许多其他内容(例如,强制停止设置一些标志以防止广播接收器在手动启动活动之前运行).现在,我不是固件专家.我只是通过与工程师的对话以及这些工程师公开发布的内容来报告我所知道的内容. (5认同)
  • @CommonsWare:如果我希望我自己的应用程序"彻底死亡"并释放与之相关的所有内存:除非它可能导致其他应用程序或系统本身出现问题 - 我不在乎它是癌症,射击枪还是阿诺德施瓦辛格在做什么工作.所以请告诉我你是否知道它会导致这样的问题.如果没有 - 我将不得不同意卡车,拉斯和汤姆. (4认同)
  • @CommonsWare不好的原因是? (3认同)
  • 它可以防止框架和核心系统进程相对于应用程序的进程(例如,任务历史记录)进行自己的清理. (3认同)
  • @CommonsWare根据我的理解,通过调用android.os.Process.killProcess来杀死应用程序相当于回收内存的内核方式,当你按下"管理应用程序"中的"强制停止"按钮时,它就会被调用不是吗? (2认同)
  • 我同意@liorry这不一定是个坏主意.如果您打算终止应用程序,它可以作为ActivityManager API的备份.它也可以用来重启你自己的应用程序,虽然强行. (2认同)
  • 一个明显的理由是,如果Android不期望该过程死亡,它可能在某些情况下重新创建它.如果你想要保持死亡,你必须确保Android不认为它应该存在.正常的Android模式是删除它*需要*活着的原因,然后让Android决定它是否应该处于休眠状态,或者是否需要恢复资源. (2认同)