2010-09-01 54 views
6

我有一個獲取WakeLock的問題。它似乎不工作。 我正在嘗試獲取FULL_WAKE_LOCK,但顯示屏無法啓用,我的應用也無法執行任務。Android WakeLock

我使用以下權限:android.permission.WAKE_LOCK

我獲取代碼如下所示:

PowerManager pm = (PowerManager) getBaseContext().getSystemService(Context.POWER_SERVICE); 
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP, "My Tag"); 
wl.acquire(); 

我到底做錯了什麼?

編輯:添加另一個標誌ACQUIRE_CAUSES_WAKEUP ...但在行爲

EDIT2沒有變化:所有我試圖做的是,播放音樂並在某個事件來喚醒我的設備了。音樂工作正常,但設備保持黑色。

回答

1

你在哪裏獲得喚醒鎖?您將需要在意圖的接收者中獲取它,而不是您意圖啓動的服務/活動中。

+0

,我在一個anctivity收購它,因爲我有設定爲接收 – Coxer 2010-09-01 11:11:27

+0

我不知道我理解的活動。一個Activity不能是BroadcastReceiver,因爲BroadcastReceiver是一個抽象類而不是接口(在Java中沒有多重繼承)。你的意思是你在活動課上有一個私人靜態的BroadcastReceiver? 我要說的是,您必須在BroadcastReceiver中的onReceive()而不是從服務啓動的Activity的onCreate()中執行喚醒鎖定。 – 2010-09-02 04:51:53

7

WakeLock是保持屏幕無效的方式。相反,使用WindowManager來完成這個魔術。下面的一行就足夠了WakeLock。 WakeLock權限也需要這個工作。這個代碼也比wakeLock有效。

getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON); 

您不需要手動喚醒WakeLock。此代碼將允許Android系統自動處理鎖定。當您的應用程序處於前臺時,WakeLock被保持,否則android系統會自動釋放鎖。

但是,如果你要釋放的標誌,你可以做到這一點:

getWindow().clearFlags(LayoutParams.FLAG_KEEP_SCREEN_ON); 
+0

在我的測試中,只有在活動的onCreate方法中調用它纔有效。例如。如果您在onCreate中添加FLAG_KEEP_SCREEN_ON,然後嘗試將其刪除,則無效,反之亦然。在ICS 4.0.3 – 2012-10-02 12:29:47

+0

上測試,您可以在任何地方使用它。你需要使用上下文。 – 2012-10-11 09:34:09

3
private static PowerManager.WakeLock lockStatic = null; 
private static String LOCK_NAME_STATIC = "MyWakeLock"; 

public static void acquireStaticLock(Context context) { 
    getLock(context).acquire(); 
} 

synchronized private static PowerManager.WakeLock getLock(Context context) { 
    if (lockStatic == null) { 
     PowerManager mgr = (PowerManager) context 
       .getSystemService(Context.POWER_SERVICE); 
     lockStatic = mgr.newWakeLock(PowerManager.FULL_WAKE_LOCK, 
       LOCK_NAME_STATIC); 
     lockStatic.setReferenceCounted(true); 
    } 

    return (lockStatic); 
} 

用法:

呼叫acquireStaticLock()當你需要acuire鎖

當您需要釋放鎖時撥打getLock(this).release();內部活動

另外在minifest文件中添加權限:

<uses-permission android:name="android.permission.WAKE_LOCK" /> 
+1

您需要定義LOCK_NAME_STATIC才能使用上面的代碼。例如。私人靜態字符串LOCK_NAME_STATIC =「MyWakeLock」; – 2012-10-02 12:58:51