2015-09-15 42 views
1

我正在研究一種傾聽周圍聲音並執行命令的Android應用程序。Android:從服務中喚醒屏幕

其中一個命令正在喚醒屏幕。

爲了實現這一目標,我用我的服務內下面的函數,

private void wakeupScreen() { 
    new AsyncTask<Void, Void, Exception>() { 
     @Override 
     protected Exception doInBackground(Void... params) { 
      try { 
       PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
       PowerManager.WakeLock fullWakeLock = powerManager.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "Loneworker - FULL WAKE LOCK"); 
       fullWakeLock.acquire(); // turn on 
       try { 
        Thread.sleep(10000); // turn on duration 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       fullWakeLock.release(); 
      } catch (Exception e) { 
       return e; 
      } 
      return null; 
     } 
    }.execute(); 
} 

不過,我有幾個問題與此代碼:(它運行在一個服務

  • 使用SCREEN_BRIGHT_WAKE_LOCKFULL_WAKE_LOCKdeprecated

  • AsyncTask和sleep的使用看起來像是一種以非阻塞方式打開屏幕的不好解決方案。

我想知道是否有更優雅的方式存在。有什麼建議麼?

回答

0

我做以下

WindowManager.LayoutParams params = getWindow().getAttributes(); 
params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON; 
params.screenBrightness = 1; 
getWindow().setAttributes(params); 

或試試這個

Window window = this.getWindow(); 
window.addFlags(LayoutParams.FLAG_DISMISS_KEYGUARD); 
window.addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED); 
window.addFlags(LayoutParams.FLAG_TURN_SCREEN_ON); 
+1

但是一個服務沒有'getWindow'方法。 – barak1412

0

顯然,沒有優雅的方式來實現這一目標。

我將我的3個非優雅的解決方案總結於這個問題,對於未來的讀者:

  • 使用wakelocks以異步方式:

    private void wakeupScreen() { 
        new AsyncTask<Void, Void, Exception>() { 
         @Override 
         protected Exception doInBackground(Void... params) { 
          try { 
           PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
           PowerManager.WakeLock fullWakeLock = powerManager.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "Loneworker - FULL WAKE LOCK"); 
           fullWakeLock.acquire(); // turn on 
           try { 
            Thread.sleep(10000); // turn on duration 
           } catch (InterruptedException e) { 
            e.printStackTrace(); 
           } 
           fullWakeLock.release(); 
          } catch (Exception e) { 
           return e; 
          } 
          return null; 
         } 
        }.execute(); 
    } 
    
  • Launch an activity that turns the screen on.

  • Simulate HOME button click.(類似於解決方案2,無需創建自定義活動,並且行爲稍有不同)

我發現第一個解決方案是最適合我的需求的。