การเก็บหน้าจอให้ตื่นอยู่ (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_ON | Activity/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 วินาที) → หน้าจอยังคงตื่นอยู่ ไม่ดับ