เปิดหน้าจออุปกรณ์ค้างไว้

อุปกรณ์ Android ที่ไม่มีการใช้งานจะตกลงมาอย่างรวดเร็วเพื่อไม่ให้แบตเตอรี่หมดเร็ว นอนหลับ อย่างไรก็ตาม บางครั้งแอปพลิเคชันจำเป็นต้องปลุกระบบหน้าจอ หรือ CPU และเปิดค้างไว้เพื่อทำงานบางอย่างให้เสร็จสิ้น

วิธีที่ใช้จะขึ้นอยู่กับความต้องการของแอป อย่างไรก็ตาม กฎทั่วไป คุณควรใช้แนวทางที่เบาที่สุดเท่าที่จะทำได้สำหรับ เพื่อลดผลกระทบที่แอปของคุณมีต่อทรัพยากรระบบ ส่วนต่อไปนี้ อธิบายวิธีจัดการกับกรณีที่พฤติกรรมการนอนหลับเริ่มต้นของอุปกรณ์ ใช้ร่วมกับข้อกำหนดของแอปไม่ได้

ทางเลือกอื่นๆ ในการใช้ Wake Lock

ก่อนที่จะเพิ่มการรองรับ Wake Lock ลงในแอป ให้พิจารณาว่าผู้ใช้ใช้แอปของคุณ กรณีการสนับสนุนทางเลือกอื่นดังต่อไปนี้

เปิดหน้าจอไว้

บางแอปจะต้องเปิดหน้าจอไว้ เช่น แอปเกมหรือแอปภาพยนตร์ วิธีที่ดีที่สุดคือการใช้ FLAG_KEEP_SCREEN_ON ในกิจกรรม (และเฉพาะในกิจกรรมเท่านั้น อย่าใช้ในบริการหรือแอปอื่นๆ คอมโพเนนต์) เช่น

Kotlin

class MainActivity : Activity() {

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

Java

public class MainActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  }
}

ข้อได้เปรียบของวิธีนี้คือ ซึ่งไม่เหมือนกับ Wake Lock (กล่าวใน ใช้ CPU เปิดอยู่) ไม่จำเป็นต้องใช้สิทธิ์พิเศษและแพลตฟอร์ม จัดการผู้ใช้ที่ย้ายไปมาระหว่างแอปพลิเคชันต่างๆ ได้อย่างถูกต้องโดยที่แอปของคุณไม่จำเป็นต้องใช้ หมดห่วงเรื่องปล่อยทรัพยากรที่ไม่ได้ใช้

อีกวิธีหนึ่งในการนำพารามิเตอร์นี้ไปใช้คือในไฟล์ XML สำหรับการจัดวางของแอปพลิเคชัน โดยใช้ แอตทริบิวต์ android:keepScreenOn:

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

การใช้ android:keepScreenOn="true" เทียบเท่ากับการใช้ FLAG_KEEP_SCREEN_ON คุณสามารถใช้วิธีใดก็ได้ที่เหมาะกับแอปของคุณมากที่สุด ประโยชน์ของการตั้งค่า ที่ถูกตั้งค่าสถานะแบบเป็นโปรแกรมในกิจกรรมของคุณคือการให้ตัวเลือก การล้างค่าสถานะโดยใช้โปรแกรม ในภายหลัง จึงทำให้หน้าจอสามารถ ปิดอยู่

โหมดแอมเบียนท์สำหรับทีวี

ในทีวี FLAG_KEEP_SCREEN_ON ควรใช้เพื่อป้องกันไม่ให้อุปกรณ์เข้าไปใน โหมดแอมเบียนท์ ขณะเล่นวิดีโออยู่ เมื่อไม่ได้ตั้งค่า FLAG_KEEP_SCREEN_ON ตามกิจกรรมเบื้องหน้า อุปกรณ์จะเข้าสู่โหมดแอมเบียนท์โดยอัตโนมัติ หลังจากไม่มีการใช้งานเป็นระยะเวลาหนึ่ง

เปิด CPU ไว้

หากคุณต้องการให้ CPU ทำงานต่อไปเพื่อให้ทำงานบางส่วนเสร็จก่อน จะเข้าสู่โหมดสลีป คุณสามารถใช้ ฟีเจอร์บริการของระบบ PowerManager ที่เรียกว่า Wake Lock Wake Lock ช่วยให้แอปพลิเคชันควบคุมสถานะพลังงานได้ ของอุปกรณ์โฮสต์

การสร้าง Wake Lock ค้างไว้อาจส่งผลกระทบอย่างมากต่ออุปกรณ์ของโฮสต์ อายุการใช้งานแบตเตอรี่ ดังนั้น คุณควรใช้ Wake Lock เฉพาะเมื่อจำเป็นเท่านั้นและ ให้รอนานที่สุดเท่าที่จะทำได้ ตัวอย่างเช่น คุณไม่ควรต้อง ใช้ Wake Lock ในกิจกรรม ตามที่อธิบายไว้ข้างต้น ถ้าคุณต้องการเก็บ เปิดหน้าจอในกิจกรรม FLAG_KEEP_SCREEN_ON

กรณีที่ถูกต้องอย่างหนึ่งสำหรับการใช้ Wake Lock อาจเป็นบริการที่ทำงานอยู่เบื้องหลังที่ ต้องจับการทำงานขณะล็อกเพื่อให้ CPU ทำงานได้ในขณะที่หน้าจอ ปิดอยู่ อย่างไรก็ตาม แนวทางปฏิบัตินี้ควรลดลงได้เนื่องจากผลกระทบที่มีต่อ อายุการใช้งานแบตเตอรี่

หากต้องการใช้ Wake Lock ขั้นตอนแรกคือให้เพิ่ม WAKE_LOCK ในการ ไฟล์ Manifest ของแอปพลิเคชันของคุณ:

<uses-permission android:name="android.permission.WAKE_LOCK" />

หากแอปของคุณมี Broadcast Receiver ที่ใช้บริการเพื่อทำงานบางอย่าง นี่คือวิธีการตั้งค่า Wake Lock โดยตรง

Kotlin

val wakeLock: PowerManager.WakeLock =
        (getSystemService(Context.POWER_SERVICE) as PowerManager).run {
            newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag").apply {
                acquire()
            }
        }

Java

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
        "MyApp::MyWakelockTag");
wakeLock.acquire();

หากต้องการปล่อย Wake Lock ให้โทร wakelock.release() การดำเนินการนี้จะถอนการอ้างสิทธิ์ของคุณไปยัง CPU สิ่งสำคัญคือต้องปล่อย Wake Lock เนื่องจาก ทันทีที่ใช้แอปเสร็จเพื่อไม่ให้แบตเตอรี่หมดเร็ว