Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีป้องกันไม่ให้อุปกรณ์ Android เข้าสู่โหมด Sleep

การเก็บหน้าจอให้ตื่นอยู่ (Keep Screen On) ใน Android

ตัวอย่างนี้แสดงวิธีใช้ WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON เพื่อป้องกันไม่ให้หน้าจอดับ/เข้าสู่ Sleep Mode ขณะแอปทำงาน

ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่

Android Studio → File → New Project → กรอกรายละเอียด → Finish

ขั้นตอนที่ 2: Layout - 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="หน้าจอไม่ดับ!"
        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

package app.com.sample;

import androidx.appcompat.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);
        
        // วิธีที่ 1: ใช้ Flag บน Window (แนะนำ)
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }
}

ขั้นตอนที่ 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>

วิธีอื่นๆ ในการ Keep Screen On

1. ใช้ XML Attribute (ง่ายที่สุด)

<!-- ใน Layout XML ของ View ใดก็ได้ -->
<RelativeLayout ...
    android:keepScreenOn="true">
    ...
</RelativeLayout>

2. ใช้โค้ดบน View

textView.setKeepScreenOn(true);

3. ใช้ PowerManager WakeLock (Low-level, ไม่แนะนำ)

// ต้องการ Permission: WAKE_LOCK
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "MyApp::WakeLock");
wakeLock.acquire();
// ต้อง release() ใน onPause/onDestroy มิฉะนั้น Battery Drain รุนแรง
wakeLock.release();

ความแตกต่างระหว่างวิธีต่างๆ

วิธีขอบเขตความยากแนะนำ
FLAG_KEEP_SCREEN_ONActivity/Windowง่าย✅ ใช่ (Best Practice)
android:keepScreenOn="true"View และ Childrenง่ายที่สุด✅ ใช่ (สำหรับ Layout ใด Layout หนึ่ง)
View.setKeepScreenOn(true)View นั้นๆง่าย✅ ใช่
WakeLock (SCREEN_DIM/SCREEN_BRIGHT)System-wideยาก ต้องจัดการ Lifecycle เอง❌ หลีกเลี่ยง เว้นแต่จำเป็นมาก
WakeLock (PARTIAL_WAKE_LOCK)CPU On, Screen Offยากสำหรับ Background Work (Service)

⚠️ ข้อควรระวัง

  • Battery Drain - การเก็บหน้าจอตื่นใช้แบตเตอรี่มาก ใช้เฉพาะเมื่อจำเป็น (Navigation, Video, Game, Reading)
  • Release อัตโนมัติ - FLAG_KEEP_SCREEN_ON จะถูก Clear อัตโนมัติเมื่อ Activity Pause/Stop/Finish
  • ไม่ต้องการ Permission - ไม่ต้องใส่ WAKE_LOCK Permission
  • System Override - ผู้ใช้ตั้งค่า Screen Timeout สั้น ระบบอาจบังคับปิดได้
  • Doze Mode - Android 6+ Doze Mode อาจบังคับ Sleep ได้แม้ Flag นี้

Best Practice

// เปิดเมื่อต้องการ (เช่น เริ่มเล่นวิดีโอ)
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

// ปิดเมื่อไม่ต้องการแล้ว (เช่น หยุดวิดีโอ, onPause)
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

การทดสอบ

รันแอป → รอเกิน Screen Timeout ปกติ (เช่น 30 วินาที) → หน้าจอยังคงตื่นอยู่ ไม่ดับ