我有一个使用唤醒锁来保持屏幕的服务。在服务运行期间,一切都运行良好:我能够根据不同的功能获取和释放唤醒锁。
但是,当用户关闭服务时,我会在onDestroy中释放唤醒锁。虽然我正在调用wakelock.release(),并且服务结束,但唤醒锁继续,直到进程被终止。我可以看到已经使用日志调用onDestroy,以及第二次日志调用。我做错了什么?
@Override
public void onDestroy() {
releaseMainWakeLock();
Log.d(TAG, "ScreenService destroyed");
}
private static void releaseMainWakeLock() {
if(wakeLockMain.isHeld()) {
Log.d(TAG, "Wakelock being released!");
wakeLockMain.release();
}
}
UPDATE:看起来没有代码在onDestroy中实际成功,即使onDestroy确实运行(可以通过日志调用看到)。例如,我有一些应该在onDestroy中取消注册的接收器。 onDestroy运行,服务被“杀死”,但仍然作为缓存的后台进程继续执行正在运行的服务的功能!
每次我停止并启动服务时,都会注册一组新的侦听器,但从未取消注册。例如,我有一个记录“接近事件”的接近监听器。在我启动和停止服务3次之后,将手放在接近传感器上后看着logcat显示:
“接近事件 接近事件 接近事件“
即使服务已经停止,传感器监听器应该在onDestroy中取消注册!
答案 0 :(得分:0)
我明白了。我有一个可运行的线程,每5秒重新触发一次。由于这个可运行没有停止,它正在重新注册接近传感器并重新获取唤醒锁,即使在onDestroy释放传感器并释放了唤醒锁之后!
要学习的课程:注意,服务代码不会因onDestroy而停止,并且只要流程保持活动就会继续运行!