2012/05/12

Android:キーガードはActivityではなくViewであることの影響

キーガードはFrameworkが表示しています。
キーガードはActivityではなくViewです。

パワーキー押下でスクリーンOFFするとActivityはonPauseします。
再度パワーキー押下でスクリーンONするとキーガードが表示されます。

一見すると、Activityはキーガードの裏にまわってonPauseしたかのように見えます。
しかし、実際にはスクリーンOFFの影響でActivityはonPauseしています。

続けてスクリーンONするとキーガードが表示された状態になります。
しかし、キーガードはViewなのでスクリーンOFF直前にフォアグラウンドであったActivity
のonResumeがキーガードの解除無しに呼ばれます。

これは、フォアグラウンドActivityでも画面上に表示されていないケースの一例です。
(他にもNotificationを引き出している場合やRecentTasks表示時など)

アプリによっては"画面表示されたタイミングを知りたい"というケースがあります。
前述のとおり、onResumeではこの要求を満たすことができません。
この問題を解決する方法として
Activity.onWindowFocusChanged(boolean)
があります。

また、キーガードが表示されているかどうかを取得したい場合は
KeyguardManager.inKeyguardRestrictedInputMode ()
を利用することが可能です。

参考:
http://developer.android.com/reference/android/app/KeyguardManager.html#inKeyguardRestrictedInputMode()