Android - 确保在服务器的进程被操作系统杀死时释放Wakelock

时间:2015-03-12 08:37:15

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

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

话虽这么说,我知道Android OS会在需要内存时在后台扼杀服务/应用程序。因此,我的服务可以被终止。

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

我在mWakeLock.acquire();中呼叫onStartCommand,在onDestroy呼叫mWakeLock.release();

1 个答案:

答案 0 :(得分:5)

  

如何确保WakeLock被释放?

根据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. 

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

但是,对您的问题的简短回答是方式确保 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?