Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách ngăn thiết bị Android vào chế độ ngủ (giữ màn hình sáng) theo chương trình?

Giới thiệu

Bài viết minh họa cách giữ màn hình luôn sáng (không tắt screen, không sleep) khi ứng dụng chạy, dùng WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON.

Các bước thực hiện

Bước 1: Tạo dự án mới

Khởi tạo project Android Studio.

Bước 2: Giao diện (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="Màn hình luôn sáng!"
        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>

Bước 3: Bật flag KEEP_SCREEN_ON (src/MainActivity.java)

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);

        // Giữ màn hình sáng - không tắt, không dim, không sleep
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }
}

Bước 4: 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>

Chạy ứng dụng

Kết nối thiết bị, nhấn Run. Màn hình sẽ không bao giờ tắt/sleep khi Activity này đang foreground.

Cách ngăn thiết bị Android vào chế độ ngủ (giữ màn hình sáng) theo chương trình?

Các cách khác để giữ màn hình sáng

1. Trong XML Layout (đơn giản nhất)

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:keepScreenOn="true">
    <!-- Toàn bộ Activity giữ màn hình sáng -->
</LinearLayout>

2. Trong AndroidManifest.xml (cho toàn Activity)

<activity
    android:name=".MainActivity"
    android:keepScreenOn="true">
</activity>

3. Tắt flag khi không cần nữa

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

So sánh các phương pháp

Phương phápPhạm viĐiểm mạnhĐiểm yếu
FLAG_KEEP_SCREEN_ON (Java)Activity/WindowKiểm soát động (bật/tắt runtime)Cần code
android:keepScreenOn (XML View)View + childrenĐơn giản, declarativeChỉ khi View attach
android:keepScreenOn (Manifest)Toàn ActivityKhông cần code JavaKhông tắt động được
WakeLock (PowerManager)Toàn hệ thống/ProcessMạnh nhất, giữ CPU chạyCần permission WAKE_LOCK, dễ drain pin, phức tạp

⚠️ Lưu ý quan trọng

  • FLAG_KEEP_SCREEN_ON chỉ giữ màn hình sáng, KHÔNG giữ CPU chạy (khác với WakeLock)
  • Hệ thống tự động clear flag khi Activity pause/stop → an toàn, không leak
  • Không cần permission đặc biệt (khác với WakeLock cần WAKE_LOCK)
  • Chỉ dùng khi thực sự cần: navigation, đọc sách, video call, game, nấu ăn
  • Luôn test: xoay màn hình, nhấn Home, nhận call → flag tự clear khi pause
  • Từ API 27+: setShowWhenLocked(), setTurnScreenOn() cho lock screen

WakeLock (Nâng cao - ít dùng)

// Cần: 
PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
WakeLock wakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "MyApp::WakeLock");

// Bật
wakeLock.acquire();

// Tắt (BẮT BUỘC trong onPause/onDestroy)
wakeLock.release();

Khuyên dùng FLAG_KEEP_SCREEN_ON thay vì WakeLock trừ khi cần giữ CPU chạy background.