2013-01-16 78 views
1

我拿到之後鎖定像onCreate方法,它工作正常(我還設置了權限):的Android喚醒鎖沒有被釋放

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Wake lock"); 
wl.acquire(); 

然而,當我嘗試將其釋放,如:

@Override 
protected void onDestroy() 
{ 
    super.onDestroy(); 
    wl.release(); 
} 

它由於某種原因未被釋放。這怎麼可能 ?有任何想法嗎 ?

編輯:我有一個退出按鈕,它調用finish(),然後調用onDestroy()。當我按下退出按鈕,然後把手機睡覺我希望我的程序不工作,但它的作品,這表明我的鎖沒有發佈

+0

「它不會因爲某種原因而被釋放」 - 您是如何確定這一點的? – CommonsWare

+0

即使將手機置於睡眠狀態(通過按睡眠按鈕),我的應用程序仍然可以工作 – Cemre

+0

當您「讓手機進入睡眠狀態」時,您認爲是否調用了「onDestroy()」? – CommonsWare

回答

4

確定您的WakeLock退訂代碼是否正常工作的正確方法是在發佈之前和之後使用adb shell dumpsys power以查看您的WakeLock是否已發佈。由於其他應用程序可以隨時請求並獲取WakeLocks,因此其他臨時檢查(例如,屏幕關閉時我的應用程序是否運行?)將不可靠。

1

更改release()代碼爲onPause()的活動。根據Android文檔,解釋了在Activity的onResume()中調用acquire()並釋放活動的onPause()中的wakelock。在你的情況下,你正在讓Activity進入睡眠狀態,但不會破壞它,所以它不會釋放喚醒鎖。所以移動到onPause()

+0

我有一個退出按鈕,它調用finish()然後調用onDestroy()。當我按下退出按鈕,然後讓手機進入睡眠狀態時,我希望我的程序不能工作。所以當我的程序運行時,我沒有按下睡眠按鈕。對不起,誤導。 – Cemre

1

這是我的解決方案。您可以使用isHeld()函數來做到這一點

if (wl!= null) { 
    if (wl.isHeld()) { 
     wl.release(); 
    } 
    wl= null; 
}