Android

Androidで明示的に画面をOFFにさせない

はじめに

動画系のアプリを作ることになって調べた時のメモです。

概要

Androidでは端末の設定次第で、操作がない場合一定時間経過後に画面がOFFになる挙動をとります。
今やどの動画再生系のアプリも常識的に実装されている機能だと思いますが、動画再生中に関しては画面を操作しなくとも画面がOFFにならないようにしないと、再生中も常に画面を触り続けないとならないストレフルな動画アプリになってしまいます。

 実装

調べたところ、実装方法は2種類ありました。

addFlagsする方法

Activity内で、 FLAG_KEEP_SCREEN_ONのフラグを追加します。
「フラグ立てるのはActivity内のみでな、サービスや他のコンポーネントではやるなよ。絶対にやるなよ。(意訳)」って書かれていました。

MainActivity.kt
class MainActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
    }
}

レイアウトxml上でkeepScreenOn属性を有効にする方法

別の実現方法として、レイアウトファイル上でkeepScreenOn属性を有効するにする方法があります。

activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:keepScreenOn="true">
    ...
</RelativeLayout>

備考

どちらの実現方法でも同じ挙動になりますが、Activityのコード上で明示的にフラグを追加する方法の利点としては「動的にフラグを有効化/無効化することができる」とのことでした。

また、そもそも何故画面をOFFにしたくないのかの理由如何によっては別のアプローチを検討するべきのようです。

理由 推奨
長時間のHTTPダウンロード DownloadManager
外部サーバーとのデータの同期 sync adapter
アプリがバックグラウンドサービスに依存している場合 JobSchedulerもしくはFirebase Cloud Messaging

おわりに

開発中は 開発者向けオプションスリープモードを有効にしないをONにしながら開発を行っていたため、実際にアプリを使ったユーザーから指摘されるまで、動画再生中に画面がOFFになってしまう挙動に気づきませんでした:innocent:
細かな部分ではあるかもしれませんが、動画再生系のアプリを作る際などは標準の挙動として抑えておくべきだと思います。

参考

https://developer.android.com/training/scheduling/wakelock