android – 当持有它的Activity / Service终止或完成时,wake_locks会自动释放吗?
作者:互联网
我知道最好在不再需要时立即释放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,android-activity,android-service,wakelock 来源: https://codeday.me/bug/20190630/1331989.html