5

你好我正在嘗試使用服務來控制喚醒鎖定,以便我的應用程序運行時可以永久保留屏幕。我創建了wakelock,並在onCreate()中激活它,然後在onDestroy()中釋放它,但是我得到錯誤「wl無法解析」。有人可以解釋我如何克服這個問題嗎?下面的代碼:在服務中使用喚醒鎖定Android 1.5

public class WakeLockService extends Service { 

    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 
    @Override 
    public void onCreate() { 
     PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag"); 
     wl.acquire(); 
    } 
    @Override 
    public void onDestroy() { 
     wl.release(); 
    } 
} 

回答

5

你是不是失蹤的onDestroy行

PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag"); 

()?它是onCreate()中的一個局部變量,但它並沒有在onDestroy()中聲明。或者,更可能的是,您可能希望使其成爲WakeLockService類的一個字段而不是局部變量。

9

那麼,即使你會使用一個實例變量,我認爲這不是做到這一點的方法。 誰來電destroy()?我希望不是你,這是OS的工作。 但是,當您持有喚醒鎖時,您的destroy()方法被調用的可能性非常小,因爲操作系統將首先銷燬其他活動/服務。

除此之外,獲取onCreate()方法中的喚醒鎖還爲時過晚。在到達onCreate()之前,當您通過鬧鈴或背景中的活動觸發服務時,手機可能已經進入睡眠狀態。

很難說你應該改變什麼,因爲你沒有給出很多背景。 通常的事件過程就是這樣。 A BroadcastReceiver被調用,並在onReceive()中獲得喚醒鎖並將其放入服務的靜態變量中。服務完成後,它應該調用stopSelf(),釋放喚醒鎖,然後清空保留對鎖的引用的靜態變量。另外,如果使用服務,完全喚醒鎖定很可能不是您想要的,但是部分喚醒鎖定是。你不需要屏幕繼續,對吧?

對不起,但是由於上面描述的問題,喚醒鎖確實很複雜。這絕對是一個高級話題,容易搞砸。如果你這樣做,你的應用會得到非常難看的評論,因爲持續太久是一個主要的攻擊,因爲它耗盡了電池。 請不要採取這種錯誤的方式,但考慮到你在這裏發佈的問題的性質(語法/編譯器錯誤),我強烈建議搜索沒有服務和喚醒鎖定的解決方案。

+0

感謝您的評論。在我正在使用的應用程序中,我需要手機處於100%喚醒模式,因此我使用了完整的喚醒鎖。 – Tom 2009-06-15 11:42:14

+0

部分喚醒鎖應足以啓動CPU並使用網絡。 – Eno 2010-07-01 05:20:06

+0

也謝謝我。你的解釋是簡潔的,並且比問題和答案更有幫助:) – Melllvar 2010-10-05 07:54:05