อุปกรณ์ Android ที่ไม่มีการใช้งานจะตกลงมาอย่างรวดเร็วเพื่อไม่ให้แบตเตอรี่หมดเร็ว นอนหลับ อย่างไรก็ตาม บางครั้งแอปพลิเคชันจำเป็นต้องปลุกระบบหน้าจอ หรือ CPU และเปิดค้างไว้เพื่อทำงานบางอย่างให้เสร็จสิ้น
วิธีที่ใช้จะขึ้นอยู่กับความต้องการของแอป อย่างไรก็ตาม กฎทั่วไป คุณควรใช้แนวทางที่เบาที่สุดเท่าที่จะทำได้สำหรับ เพื่อลดผลกระทบที่แอปของคุณมีต่อทรัพยากรระบบ ส่วนต่อไปนี้ อธิบายวิธีจัดการกับกรณีที่พฤติกรรมการนอนหลับเริ่มต้นของอุปกรณ์ ใช้ร่วมกับข้อกำหนดของแอปไม่ได้
ทางเลือกอื่นๆ ในการใช้ Wake Lock
ก่อนที่จะเพิ่มการรองรับ Wake Lock ลงในแอป ให้พิจารณาว่าผู้ใช้ใช้แอปของคุณ กรณีการสนับสนุนทางเลือกอื่นดังต่อไปนี้
หากแอปทำการดาวน์โหลด HTTP เป็นระยะเวลานาน โปรดพิจารณาใช้
DownloadManager
หากแอปของคุณซิงค์ข้อมูลจากเซิร์ฟเวอร์ภายนอก ให้พิจารณาสร้าง อะแดปเตอร์การซิงค์
หากแอปของคุณต้องใช้บริการในเบื้องหลัง ให้พิจารณาใช้ JobScheduler หรือ การรับส่งข้อความในระบบคลาวด์ของ Firebase เพื่อทริกเกอร์บริการเหล่านี้ในช่วงเวลาที่เจาะจง
หากคุณต้องการให้แอปที่ใช้ร่วมกันทำงานต่อไปทุกครั้งที่มีอุปกรณ์ที่ใช้ร่วมกัน ภายในช่วง ให้ใช้โปรแกรมจัดการอุปกรณ์ที่ใช้ร่วมกัน
เปิดหน้าจอไว้
บางแอปจะต้องเปิดหน้าจอไว้ เช่น แอปเกมหรือแอปภาพยนตร์
วิธีที่ดีที่สุดคือการใช้
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 เนื่องจาก
ทันทีที่ใช้แอปเสร็จเพื่อไม่ให้แบตเตอรี่หมดเร็ว