Duy trì trạng thái bật của thiết bị

Để tránh làm tiêu hao pin, thiết bị Android đang ở trạng thái rảnh sẽ nhanh chóng chuyển sang chế độ ngủ. Tuy nhiên, đôi khi ứng dụng cần đánh thức màn hình hoặc CPU và giữ cho ứng dụng luôn thao tác để hoàn thành một số công việc.

Phương pháp bạn thực hiện phụ thuộc vào nhu cầu của ứng dụng. Tuy nhiên, nguyên tắc chung là bạn nên sử dụng phương pháp đơn giản nhất có thể cho ứng dụng, để giảm thiểu tác động của ứng dụng đến tài nguyên hệ thống. Các phần sau đây mô tả cách xử lý các trường hợp hành vi ngủ mặc định của thiết bị không tương thích với các yêu cầu của ứng dụng.

Lựa chọn thay thế cho việc sử dụng khoá chế độ thức

Trước khi thêm tính năng hỗ trợ khoá chế độ thức vào ứng dụng, hãy cân nhắc xem các trường hợp sử dụng của ứng dụng có hỗ trợ một trong các giải pháp thay thế sau đây hay không:

Luôn bật màn hình

Một số ứng dụng cần giữ màn hình luôn bật, chẳng hạn như ứng dụng trò chơi hoặc phim. Cách tốt nhất để làm điều này là dùng FLAG_KEEP_SCREEN_ON trong hoạt động của bạn (và chỉ trong một hoạt động, không bao giờ trong một dịch vụ hoặc thành phần khác của ứng dụng). Ví dụ:

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

Ưu điểm của phương pháp này là không giống như khoá chế độ thức (được thảo luận trong bài viết Giữ CPU luôn bật), phương pháp này không yêu cầu quyền đặc biệt và nền tảng sẽ quản lý chính xác việc người dùng di chuyển giữa các ứng dụng mà ứng dụng của bạn không cần lo lắng về việc giải phóng tài nguyên không dùng đến.

Một cách khác để triển khai việc này là trong tệp XML bố cục của ứng dụng, bằng cách sử dụng thuộc tính 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>

Việc sử dụng android:keepScreenOn="true" tương đương với việc sử dụng FLAG_KEEP_SCREEN_ON. Bạn có thể sử dụng bất kỳ phương pháp nào phù hợp nhất với ứng dụng của mình. Ưu điểm của việc đặt cờ theo phương thức lập trình trong hoạt động là bạn có thể xoá cờ theo phương thức lập trình sau đó, từ đó cho phép màn hình tắt.

Chế độ môi trường xung quanh cho TV

Trên TV, bạn nên dùng FLAG_KEEP_SCREEN_ON để ngăn thiết bị chuyển sang Chế độ môi trường xung quanh trong khi video đang phát. Khi hoạt động ở nền trước không đặt FLAG_KEEP_SCREEN_ON, thiết bị sẽ tự động chuyển sang Chế độ môi trường xung quanh sau một khoảng thời gian không hoạt động.

Tiếp tục bật CPU

Nếu cần duy trì CPU để hoàn thành một số công việc trước khi thiết bị chuyển sang chế độ ngủ, bạn có thể dùng tính năng dịch vụ hệ thống PowerManager có tên là khoá chế độ thức. Khoá chế độ thức cho phép ứng dụng của bạn kiểm soát trạng thái nguồn của thiết bị lưu trữ.

Việc tạo và giữ khoá chế độ thức có thể có tác động đáng kể đến thời lượng pin của thiết bị lưu trữ. Do đó, bạn chỉ nên sử dụng khoá chế độ thức khi thực sự cần thiết và giữ các khoá này trong thời gian ngắn nhất có thể. Ví dụ: bạn không bao giờ cần sử dụng khoá chế độ thức trong một hoạt động. Như mô tả ở trên, nếu bạn muốn giữ màn hình bật trong hoạt động của mình, hãy dùng FLAG_KEEP_SCREEN_ON.

Một trường hợp hợp lệ cho việc sử dụng khoá chế độ thức có thể là dịch vụ nền cần lấy khoá chế độ thức để giữ cho CPU hoạt động khi màn hình tắt. Tuy nhiên, bạn nên giảm thiểu phương pháp này do ảnh hưởng đến thời lượng pin.

Để sử dụng khoá chế độ thức, bước đầu tiên là thêm quyền WAKE_LOCK vào tệp kê khai của ứng dụng:

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

Nếu ứng dụng của bạn bao gồm một broadcast receiver sử dụng một dịch vụ để thực hiện một số công việc, thì dưới đây là cách bạn trực tiếp thiết lập khoá chế độ thức:

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

Để mở khoá chế độ thức, hãy gọi wakelock.release(). Thao tác này sẽ huỷ bỏ thông báo xác nhận quyền sở hữu của bạn đối với CPU. Bạn cần phải nhả khoá chế độ thức ngay khi ứng dụng sử dụng xong để tránh tiêu hao pin.