【问题标题】:Android - Ensuring that Wakelock is released when a Service's process is killed by OSAndroid - 确保在服务的进程被操作系统杀死时释放唤醒锁
【发布时间】:2015-05-14 07:59:47
【问题描述】:

我希望我的FusedLocationProvider 即使在屏幕关闭时也能 ping 定位。为此,在我的服务中,我有一个PARTIAL_WAKE_LOCK,以保持 CPU 运行并确保即使在屏幕关闭时服务也能继续运行。

话虽如此,我知道 Android 操作系统会在需要内存时在后台终止服务/应用程序。因此,我的服务可能会被终止。

当这种情况发生时,Service 中的onDestroy() 不能保证被调用。如果是这种情况,我如何确保 WakeLock 被释放?

我在onStartCommand 中调用mWakeLock.acquire();,在onDestroy 中我调用mWakeLock.release();

【问题讨论】:

    标签: android android-service android-lifecycle android-wake-lock


    【解决方案1】:

    我如何确保唤醒锁被释放?

    根据docs

    If the service is currently executing code in its onCreate(), 
    onStartCommand(), or onDestroy() methods, then the hosting process will be a 
    foreground process to ensure this code can execute without being killed. 
    

    这意味着,如果任何这些方法中的代码当前正在执行,那么在代码完成执行之前,该进程不会被终止(或至少将被赋予非常高的优先级)。

    但是,对您的问题的简短回答是 NO 方法可以确保onDestroy()onPause() 被调用。不过,onPause() 确实有更大的概率被跟注,所以你可以调查一下。还有一种方法,Application.onTerminate(),您可能希望将其用于进一步研究。该方法仅在模拟器上运行应用程序时调用。

    不过,我认为您不必担心内存泄漏(假设我们都在同一页面上了解此类泄漏的构成)。当进程被杀死时,内存由内核回收,而不是由 GC,因此在这种情况下不会发生内存泄漏。

    编辑:

    我已经确认,如果一个进程被杀死,一个获得的唤醒锁必然会被释放:

    1. Does the android os release a wakelock if the app or service holding it is killed ?.

    2. What happens with the partial wake lock if the process that acquires is killed ?.

    3. Binders & Death Recipients.

    4. How to deal with (orphaned) WakeLocks?.

    【讨论】:

    • 是的,我猜内存泄漏的措辞很糟糕。我主要担心的是,我的 WakeLock 永远不会被释放,并且由于 CPU 始终处于活动状态,我的应用程序将耗尽电池电量。
    猜你喜欢
    • 2011-06-09
    • 2015-05-12
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多