2012-04-27 45 views
7

我的活動以部分喚醒鎖運行,因爲它持續處理接收到的藍牙數據。喚醒鎖設置如下:如何在部分喚醒鎖定期間打開屏幕

powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock"); 
    wakeLock.acquire(); 

當發生某些事件時,我想在顯示屏上顯示,以便用戶查看狀態。我想讓顯示器自動打開,而不是通過用戶按鍵。 但是,所有嘗試這樣做都失敗了。 當使用部分喚醒鎖定運行時,顯示屏關閉時,我嘗試重新顯示屏幕並讓用戶看到當前活動失敗。我曾試圖僞造的用戶活動:

PowerManager NewPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    NewPowerManager.userActivity(1, false); 

設置標誌的窗口:

Window win = getWindow(); 
    win.setFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON, WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 

即使釋放喚醒鎖,並開始另一個應該打開屏幕:

if (wakeLock != null) 
    { 
     wakeLock.release(); // release the wakelock 
    } 
PowerManager.WakeLock TempWakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | 
    PowerManager.ACQUIRE_CAUSES_WAKEUP, "TempWakeLock"); 
    // tried | PowerManager.ON_AFTER_RELEASE to no avail 
    TempWakeLock.acquire(); 

有什麼我在這裏失蹤?我並非試圖開放一項新的活動,而只是向用戶展示我目前的活動。 有沒有其他人能夠做到這一點? 謝謝你可以給我的任何幫助。

回答

9

在HTC看到一些來自Lance的演示代碼後,終於能夠解決這個問題(順便說一下,謝謝)。

這個祕密似乎是用ACQUIRE_CAUSES_WAKEUP集創建一個額外的完整喚醒鎖。我不釋放原始的部分喚醒鎖,但是當我想打開顯示器時,我創建了新的全部喚醒鎖,完成我的工作,然後釋放新的完全喚醒鎖。這實際上有效!

PowerManager TempPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
PowerManager.WakeLock TempWakeLock = TempPowerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | 
PowerManager.ON_AFTER_RELEASE, "TempWakeLock"); 
TempWakeLock.acquire(); 

// do the work that needs the visible display... 

// Release the newest wakelock and fall back to the old one 
TempWakeLock.release();