【Android開発】画面をスリープモードにさせない方法を解説(FLAG_KEEP_SCREEN_ONの使い方)
Androidアプリを開発していると、「動画再生中」「レシピ表示中」「ナビゲーション画面」など、ユーザーが画面を見ている間はスリープモードに移行してほしくない場面があります。
本記事では、WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON を使って、Androidデバイスが自動的にスリープモードに入るのを防ぐ方法を、サンプルコード付きでステップごとに解説します。
FLAG_KEEP_SCREEN_ON とは?
FLAG_KEEP_SCREEN_ON は、対象のウィンドウ(アクティビティ)が画面に表示されている間、端末の画面をオンの状態に保つためのフラグです。大きなメリットとして、特別なパーミッションが不要な点が挙げられます。後述する WakeLock とは異なり、AndroidManifest.xml に権限を追加する必要はありません。
実装手順
ステップ1:新規プロジェクトを作成する
Android Studioを開き、メニューから「File → New Project」を選択して、必要な項目を入力し、新しいプロジェクトを作成します。
ステップ2:レイアウトファイル(activity_main.xml)を編集する
res/layout/activity_main.xml に以下のコードを追加します。画面中央にオレンジ色のテキストを表示するシンプルなレイアウトです。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="MainActivity">
<TextView
android:text="Stay Awake Android!"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:id="@+id/textView"
android:gravity="center"
android:textSize="25dp"
android:textStyle="bold"
android:textColor="#FF9800"/>
</RelativeLayout>
ステップ3:MainActivity.java にフラグを設定する
src/MainActivity.java の onCreate() メソッド内で、getWindow() に対して FLAG_KEEP_SCREEN_ON を追加します。これだけで、このアクティビティが表示されている間は画面がスリープしなくなります。
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.WindowManager;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
}
ステップ4:AndroidManifest.xml を確認する
androidManifest.xml には、特別なパーミッションの追加は不要です。以下のように通常のマニフェスト定義のままで動作します。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.sample">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
アプリを実行して確認する
それでは、実際にアプリを実行してみましょう。実機のAndroidスマートフォンをPCに接続している前提で説明します。Android Studioでプロジェクト内のアクティビティファイルを開き、ツールバーのRunアイコンをクリックします。デバイス選択ダイアログで自分のモバイル端末を選択すると、実機の画面に以下のようなデフォルト画面が表示されます。

この状態でしばらく待っても画面が暗転・スリープしなければ、実装は成功です。
補足:その他のスリープ防止方法との比較
- XMLレイアウトで指定する方法: レイアウトファイル内で
android:keepScreenOn="true"を設定することでも同じ効果が得られます。Javaコードを書かずに済むため、レイアウト全体で常時点灯させたい場合に便利です。 - WakeLockを使う方法: PowerManagerの WakeLock を利用すれば画面以外(CPUなど)もスリープさせないようにできますが、WAKE_LOCKパーミッションが必要で、解放し忘れるとバッテリーを大きく消費します。画面だけを点灯させ続けたい場合は、FLAG_KEEP_SCREEN_ON の使用が公式にも推奨されています。
アクティビティがバックグラウンドに移動した際は、clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) を呼び出してフラグを解除しておくと、より丁寧な実装になります。
-
スマホの発熱・過熱を防ぐ7つの対策方法
```html スマートフォンでは、映画や高画質動画の視聴、ゲーム、各種ユーティリティアプリなど、さまざまなアプリを日常的に使います。しかし使用を続けていると、端末が徐々に熱を持ち始め、最悪の場合は故障につながることもあります。動画を長時間視聴したり、ゲームを長くプレイした後に端末が熱くなった経験はありませんか。その主な原因の一つがバッテリーの発熱で、充電速度が速いほど端末の温度も上がりやすくなります。熱はスマートフォンにとって大敵です。過度な高温状態が続くと、内部パーツが損傷する恐れがあります。とはいえ、スマホの過熱は適切な対策で十分に予防できます。ここでは、その具体的な方法をご紹介します。
-
Androidアプリのクラッシュ・フリーズを防ぐ7つの対処法
Androidユーザーは自由にアプリをダウンロードできますが、そのアプリが自分のデバイスでどのように動作するかは、実際に使ってみるまで分かりません。特定のアプリが一部の端末で正常に動作せず、頻繁にクラッシュした経験がある方も多いのではないでしょうか。Google Playストアで配信されているアプリ自体は安全ですが、それでもクラッシュ、フリーズ、動作の遅さといったトラブルを引き起こす要因は他にも存在します。新しいスマートフォンは高性能なプロセッサを搭載しているため、クラッシュ問題はある程度軽減されていますが、完全に防げるわけではありません。そこで本記事では、Androidアプリのクラッシュ問題