2015-05-14 52 views
19

我希望我的應用能夠打開屏幕並顯示我的應用。假設我正在設置鬧鐘,並且每隔一小時我希望我的應用在設備自然睡眠之前顯示2分鐘。打開接收器/服務屏幕

我發現不推薦使用WakeLock(FULL_LOCK)和KeyguardManager。

我創建了一個WakefulBroadcastReceiver和服務,這些工作。

@Override 
protected void onHandleIntent(Intent intent) { 
    // I need to show the screen here! 

    for (int i=0; i<5; i++) { 
     Log.i("SimpleWakefulReceiver", "Running service " + (i + 1) 
       + "/5 @ " + SystemClock.elapsedRealtime()); 
     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
     } 
    } 
    Log.i("SimpleWakefulReceiver", "Completed service @ " + 
      SystemClock.elapsedRealtime()); 
    SimpleWakefulReceiver.completeWakefulIntent(intent); 
} 

如何以編程方式打開屏幕,獲取過去的鎖並從IntentService顯示我的Activity?

謝謝

+0

'我看到WakeLock和KeyguardManager已被棄用。'請添加一個鏈接 –

+0

全鎖需要http://developer.android.com/reference/android/os/PowerManager.html#FULL_WAKE_LOCK 和http://developer.android.com/reference/android/app/KeyguardManager .KeyguardLock.html – RuAware

回答

24

您可以使用此代碼打開屏幕。

lock = ((KeyguardManager) getSystemService(Activity.KEYGUARD_SERVICE)).newKeyguardLock(KEYGUARD_SERVICE); 
powerManager = ((PowerManager) getSystemService(Context.POWER_SERVICE)); 
wake = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG"); 

lock.disableKeyguard(); 
wake.acquire(); 
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
       | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 
       | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
       | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
       | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON); 

您需要在AndroidManifest.xml文件以下權限:

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

EDIT(使用這一個,沒有什麼是不建議使用):
有這樣做的一個比較另類,爲此,您需要啓動一項活動,在活動onCreate()中,您需要將標誌添加到窗口中。 例如:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);` 
} 
+0

謝謝,但請參閱PowerManager.FULL_WAKE_LOCK和Keyguard已折舊。我想要一個應用程序,一旦他們刪除它,它仍然有效。 WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD將幫助您找到快捷鍵。但仍需要喚醒顯示器。 – RuAware

+1

還有一個替代方案用於執行此操作,因爲您需要啓動一個活動,在活動onCreate()中,需要將標誌添加到窗口中,並且不推薦使用FLAG_DISMISS_KEYGUARD。 。 getWindow()addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON); – Kartheek

+0

謝謝,啓動這些設置作品的新活動,如果你把這個作爲解決方案,我會標記爲正確的。 – RuAware

2

我不知道你在說什麼,wakelock絕對不會被棄用。某些類型已不再是Google首選的方式,但正常的喚醒方式仍然存在,仍然是最簡單的方法。確保在鎖定時添加ACQUIRE_CAUSES_WAKEUP標誌。實際上,注意到一個WakefulBroadcastReceiver是通過使用wakelocks實現的。

+0

我可以用PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP 但PowerManager.FULL_WAKE_LOCK貶值在17 隨着KeyguardManager,只是在尋找正確的方法來做到這一點現在 – RuAware

1

您可以使用此代碼打開屏幕。

private void turnScreenOn() { 
    int flags = WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON; 
    getWindow().addFlags(flags); 
} 

您可以使用此代碼保持打開狀態,直到喚醒鎖被暗化。

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

private PowerManager mPowerManager; 
private PowerManager.WakeLock mWakeLock; 

@Override 
public void onCreate() { 
super.onCreate(); 
    mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "Service"); 
} 

private void acquireWakeLock() { 
    try { 
     mWakeLock.acquire(); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

private void releaseWakeLock() { 
    try { 
     mWakeLock.release(); 
    } 
    catch (Exception e) { 

    } 
} 
+0

謝謝,我覺得我得到的地方,並增加了類似的東西,但 PowerManager.SCREEN_DIM_WAKE_LOCK隨着BRIGHT和FULL全部折舊 您還必須確保在UIthread上添加標誌,以便嘗試 接收消息 - >在ui上運行add keep_screen_on - >使用Acquire喚醒獲取部分鎖定。 但是這並沒有打開屏幕,唯一的想法是貶值的參數 – RuAware

+0

你嘗試turnScreenOn功能嗎?如果收到某種類型的消息(基於優先級),我在GCM消息接收器中使用的那一個(基於優先級) –

+0

是的,沒有穿上uithread,我得到「只有創建視圖層次結構的原始線程可以觸摸它的視圖。」但仍然不會打開愚蠢的屏幕!儘管它有任何退化的選擇,但在我看來,他們正打算帶走一些東西,而不是給我們一個辦法。 – RuAware