とあるアプリにて、勉強中に他のアプリを開いたり、当アプリを閉じていないかを検知する機能を実装しました。また、勉強中にずっとアプリを開いていなければならないのはUX的にマズいので、スリープ時はonPause時の処理から除外するようにもしました。
ソースコード
//画面外検知の為にオーバーライド
override fun onPause() {
super.onPause()
val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
if (powerManager.isInteractive) {
//ここに別画面に移った際の処理を記述
}
}
簡単な解説
onPause
そもそもonPauseとは何かというと、アプリがバックグラウンドへ遷移したときに呼び出されるコールバックのことです。具体的には、アプリからホーム画面に遷移したときや、タスクボタンが押されたとき、スリープ状態になったときなどにonPause()が呼び出されます。
PowerManager
PowerManagerとは、デバイスの電源管理やスリープ制御ができるシステムサービスです。例えば、デバイスのスリープを防ぐようにしたり(WakeLock
)、省電力モードであるかどうかを監視する(isPowerSaveMode
)ことができます。
今回は、isInteractive
を用いて画面がオンになっている(スリープ状態でない)ことを検知させて、スリープか否かでonPause時の処理を変えることを実現することができました。