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_LOCKとACQUIRE_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”が必要になります。
作成したサンプルは、以下の内容で動作するものです。
- ボタンの押下でPendingIntent発行(10秒後にサービス実行)
- サービス内で WakeLock取得/KeyguardLock解除
- WakeLock後に表示するActivityの呼び出し/表示
詳細は以下からどうぞ。
—–
Sampleソースコード
http://techbooster.googlecode.com/svn/trunk/WakeLockSample/