android – 当持有它的ActivityService终止或完成时,wake_locks会自动释放吗?

android – 当持有它的ActivityService终止或完成时,wake_locks会自动释放吗?,第1张

概述我知道最好在不再需要时立即释放wake_lock,但是如果已经获得它的Activity或Service在释放锁之前完成或停止会发生什么?它是由系统自动释放的吗?我认为系统应该在这种情况下自动释放它们,但我在API文档中找不到任何内容. 编辑:添加更多信息 查看PowerManager.WakeLock文档,我已经看到wake_locks默认是引用计数(读取setReferenceCounted h 我知道最好在不再需要时立即释放wake_lock,但是如果已经获得它的Activity或Service在释放锁之前完成或停止会发生什么?它是由系统自动释放的吗?我认为系统应该在这种情况下自动释放它们,但我在api文档中找不到任何内容.

编辑:添加更多信息

查看PowerManager.WakeLock文档,我已经看到wake_locks默认是引用计数(读取setReferenceCounted here),即如果我们使用PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,“myWakeLock”); wl.acquire();然后保持它的参考变量wl超出范围,然后释放唤醒锁定,因为它的引用计数变为零……是不是正确?

编辑:错误的理解上面

我想我误解了上面的引用计数概念……它应该意味着如果我获得两次锁定并只释放一次,那么引用计数为1并且锁定尚未释放.如果它不是引用计数,那么我可以获得x次,然后在单个版本中它被释放.

解决方法 关于这一点,网上似乎传播了很多错误信息. AndroID API中暴露的WakeLocks具有相当复杂的生命周期,除了非常勤奋地管理它之外别无他法.

如果活动或服务在没有释放唤醒锁的情况下停止,则状态未定义.如果您检查代码(https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/os/PowerManager.java,搜索“类WakeLock”),您将看到它们在被垃圾回收时被释放.

然而,这“当它们被垃圾收集时”是一个非常宽松的陈述.在实践中,似乎Lollipop之前的设备对于唤醒锁定的GC来说真的很慢(我们可以假装它根本没有用于实际目的),但是对于带有ART运行时的Lollipop后设备,似乎流浪的WakeLocks是垃圾收集的.几秒钟.

关于引用计数的问题,您可以在AndroID代码中看到锁被释放,而不管它有多少计数.

如果你对AndroID代码负责,你也可以看到它多年来没有太大变化 – 所以这一切都归结为GC的行为方式.因此,您需要勤奋,将锁存储在您的活动/服务的字段中,并在应用程序生命周期中的合理位置发布/获取.但是,如果可能的话,你不应该使用唤醒锁,而只需使用Gatekeeper On技巧,Gatekeeper将链接到其中一个答案中.

总结

以上是内存溢出为你收集整理的android – 当持有它的Activity / Service终止或完成时,wake_locks会自动释放吗?全部内容,希望文章能够帮你解决android – 当持有它的Activity / Service终止或完成时,wake_locks会自动释放吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1127262.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存