gpt4 book ai didi

android - 当持有它的 Activity/服务终止或完成时,wake_locks 会自动释放吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:05:46 24 4
gpt4 key购买 nike

我知道最好的做法是在不再需要时立即释放 wake_lock,但是如果 ActivityService,例如,在您释放锁之前已经获取它完成或停止?是系统自动释放的吗?我认为系统应该在这种情况下自动释放它们,但我在 API 文档上找不到任何内容..

编辑:添加了更多信息

查看 PowerManager.WakeLock 文档,我发现 wake_locks 默认是引用计数(阅读setReferenceCounted here ),即如果我们使用 PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "myWakeLock"); 在 Activity 中检索唤醒锁; wl.acquire(); 然后持有它的引用变量 wl 超出范围,然后释放唤醒锁,因为它的引用计数变为零......是不是对的?

编辑:上面的错误理解

我想我误解了上面的引用计数概念……应该是说如果​​我获取了两次锁,只释放了一次,那么引用计数为1,锁还没有释放。如果它不是引用计数,那么我可以获取 x 次,然后通过一次释放将其释放。

最佳答案

网络上似乎传播了很多关于此的错误信息。 Android API 中公开的 WakeLock 具有相当复杂的生命周期,除了非常勤奋地管理它之外别无他法。

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

然而,“当它们被垃圾收集时”是一个非常宽松的说法。在实践中,Lollipop 之前的设备似乎对 GC 唤醒锁来说真的很慢(出于实际目的,我们可以假装它根本没有发生),但是在具有 ART 运行时的 Lollipop 之后的设备上,杂散的 WakeLock 似乎是在一个几秒钟。

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

如果您将责任归咎于 Android 代码,您还可以看到它多年来没有太大变化 - 所以这一切都归结为 GC 的行为方式。所以你需要勤奋,将锁存储在你的 Activity/服务的一个字段中,并在应用程序生命周期中的合理位置释放/获取。但是,如果可能的话,您不应该使用唤醒锁,而应该使用 Gatekeeper 在其他答案之一中链接到的 Force Screen On 技巧。

关于android - 当持有它的 Activity/服务终止或完成时,wake_locks 会自动释放吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12131274/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com