WakeLockを取得し、Sleep状態からWake状態へ遷移する


アプリケーションを作成していく上で、ユーザーへの通知は欠かせないものです。
例えば、常駐型のアプリケーションを作成している折に、Sleep中にユーザー通知を行ないたい場合があると思います。
ロック画面(本文では KeyguardLockと記載)

従来のやり方で、Service等からIntentでActionを起動したとしても、Sleepは解除されません。
本日は、ApplicationからのSleepの解除とロック画面の解除を制御する方法を以下二点の内容に沿って紹介していきます。

  • Sleepからの復帰
  • KeyguardLockの解除

これらについて、続きで説明していきます。

Sleepからの復帰

Sleepからの復帰にはPowerManager#WakeLock#acquire()を利用します。
acquire() Methodには引数の あり/なし の二種類があります。
両者の違いは以下の通りです。

acquire() wakelockを取得する。
acquire(long timeout) wakelockを取得し、timeout時間(msec)経過後リリースする。

使用方法は、以下ソースコード引用の通りとなります。
PowerManager.WakeLockクラスはインスタンスの生成をPowerManager#newWakeLock()
を利用します。

PowerManager#newWakeLock( int flags, String Tag)

int flags WakeLockの種類を指定する。詳細は以下
String Tag Debug用途、Logクラス使用時の第一引数のTagと揃えておくといいかも。

WakeLockの状態を指定するFlagには以下の6種類があり、

それぞれを和演算を用いて同時に設定できる。

PARTIAL_WAKE_LOCK CPUだけのWakeLock(Screen:OFF Keyboard:OFF)
SCREEN_DIM_WAKE_LOCK CPUとScreenが一段階暗い状態でWakeLock(Keyboard:OFF)
SCREEN_BRIGHT_WAKE_LOCK CPUとScreenがWakeLock(Keyboard:OFF)
FULL_WAKE_LOCK CPU、Screen、KeyBoardがWakeLock
ACQUIRE_CAUSES_WAKEUP WakeLockが取得されたときに、強制的にONにする。
ON_AFTER_RELEASE WakeLock取得時に照明がすぐに消えないように設定する。(Release後は通常の設定時間に戻る)

上記表から、今回はFULL_WAKE_LOCKACQUIRE_CAUSES_WAKEUP
ON_AFTER_RELEASEを指定している。

※ACQUIRE_CAUSES_WAKEUPがない場合照明 OFFからONには出来なかった

最後に、acquire()とrelease()を呼び出しているが、release()の呼び出しを忘れない様に
Sleep中にセンサーデバイスなどが寝てしまう場合には、このacquire-release間で
処理をすると良いかもしれません。

		/* BackGroundからのwakelock処理 */
		PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
		PowerManager.WakeLock wakelock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
				| PowerManager.ACQUIRE_CAUSES_WAKEUP
				| PowerManager.ON_AFTER_RELEASE, "Your App Tag");
		wakelock.acquire();
		wakelock.release();

※Permission “android.permission.WAKE_LOCK”が必要になります。

KeyguardLockの解除

KeyguardLockの解除には、KeyguardManager#KeyguardLock#disableKeyguard()を利用します。

利用方法は以下、引用ソースコードの通りです。
SystemServiceからKEYGUARD_SERVICEを呼び出し、ManagerのインスタンスからKeyguardManager.KeyguardLockクラスを作成しています。

		KeyguardManager km = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
		KeyguardManager.KeyguardLock klock = km.newKeyguardLock("Your App Tag");
		klock.disableKeyguard();

※Permission “android.permission.DISABLE_KEYGUARD”が必要になります。

作成したサンプルは、以下の内容で動作するものです。

  1. ボタンの押下でPendingIntent発行(10秒後にサービス実行)
  2. サービス内で WakeLock取得/KeyguardLock解除
  3. WakeLock後に表示するActivityの呼び出し/表示

詳細は以下からどうぞ。
—–
Sampleソースコード
http://techbooster.googlecode.com/svn/trunk/WakeLockSample/