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

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

Phương pháp mà bạn thực hiện phụ thuộc vào nhu cầu của ứng dụng. Tuy nhiên, quy tắc chung tin là bạn nên sử dụng phương pháp nhẹ nhất có thể cho ứng dụng của bạn để 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 mô tả cách xử lý các trường hợp mà hành vi ngủ mặc định của thiết bị là không tương thích với yêu cầu của ứng dụng.

Lựa chọn thay thế cho việc sử dụng tính năng khóa 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 liệu ứng dụng của bạn có dùng hỗ trợ một trong các giải pháp thay thế sau:

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

Một số ứng dụng nhất định cần luôn bật màn hình, chẳng hạn như ứng dụng trò chơi hoặc phim. Chiến lược phát hành đĩa đơn cách tốt nhất để làm việc này là sử 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 ứng dụng khác thành phần). 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 phần Giữ CPU đang bật), không cần có quyền đặc biệt và nền tảng quản lý chính xác việc người dùng di chuyển giữa các ứng dụng mà không cần ứng dụng của bạn phải lo lắng về việc phát hành các tài nguyên không sử dụng.

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 thiết lập cờ được lập trình trong hoạt động của bạn là nó cung cấp cho bạn tùy chọn xoá cờ theo phương thức lập trình sau đó và do đó cho phép màn hình bật tắt.

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

Trên TV, FLAG_KEEP_SCREEN_ON nên được dùng để ngăn thiết bị truy cập vào Chế độ môi trường xung quanh trong khi phát lại video đang hoạt động. Khi bạn chưa đặt FLAG_KEEP_SCREEN_ON theo hoạt động trên nền trước, 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.

Luôn bật CPU

Nếu bạn cần tiếp tục chạy CPU để hoàn tất một số công việc trước khi khi thiết bị chuyển sang chế độ ngủ, bạn có thể sử dụng Tính năng dịch vụ của hệ thống PowerManager có tên là khóa 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ể ảnh hưởng đáng kể đến thời lượng pin. Do đó, bạn chỉ nên sử dụng khoá chế độ thức khi thực sự cần thiết và hãy duy trì chúng trong khoảng 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ữ lại bật màn hình trong phần hoạt động của bạn, hãy sử 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à một dịch vụ nền cần sử dụng khoá chế độ thức để CPU có thể hoạt động bình thường trong khi màn hình tắt. Tuy nhiên, xin nhắc lại rằng bạn nên giảm thiểu phương pháp này do ảnh hưởng của nó đến thời lượng pin.

Để sử dụng khóa chế độ thức, bước đầu tiên là thêm phương thức Quyền WAKE_LOCK để 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 có một broadcast receiver sử dụng một dịch vụ để thực hiện công việc nào đó, sau đây là cách 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(). Việc này sẽ huỷ bỏ thông báo xác nhận quyền sở hữu của bạn cho CPU. Bạn cần mở khoá chế độ thức vì ngay khi ứng dụng của bạn sử dụng xong để tránh làm tiêu hao pin.