アクティビティの起動が AlarmManager によってスケジュールされるアプリケーションを作成します。画面がオフになっていて、デバイスがロックされていても表示されたいです。
これを実現するには、ウィンドウフラグを設定します
final Window win = getWindow();
win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);
そして、画面のロックを取得しようとします
if(_lock == null)
{
PowerManager pm = (PowerManager)App.getAppContext()
.getSystemService(Context.POWER_SERVICE);
_lock = pm.newWakeLock(
PowerManager.FULL_WAKE_LOCK, "ScreenOn");
_lock.acquire();
}
_lock は onPause で解放される PowerManager.WakeLock です。
protected void onPause()
{
if(_lock != null)
{
_lock.release();
}
}
このコードは onCreate と onRestart で実行されます。アクティビティがまだ開始されていない場合は、すべて正常に機能します。
ただし、以前に起動した場合、画面はオフになりません。
- onRestart が最初に呼び出されます
- 次に onResume が呼び出されます
- onPause はすぐに呼び出されます
したがって、アクティビティは開始されません。私の質問は、そのような状況で画面をオンにする方法です。(私はAPI 15を使用しています)。