Để 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:
Nếu ứng dụng của bạn đang tải xuống qua HTTP trong thời gian dài, hãy cân nhắc sử dụng
DownloadManager
.Nếu ứng dụng của bạn đang đồng bộ hoá dữ liệu từ một máy chủ bên ngoài, hãy cân nhắc tạo một đồng bộ hoá bộ điều hợp.
Nếu ứng dụng của bạn dựa vào các dịch vụ nền, hãy cân nhắc sử dụng JobScheduler hoặc Giải pháp gửi thông báo qua đám mây của Firebase để kích hoạt các dịch vụ này vào những khoảng thời gian cụ thể.
Nếu bạn cần tiếp tục chạy ứng dụng đồng hành bất cứ khi nào thiết bị đồng hành trong phạm vi, hãy sử dụng Trình quản lý thiết bị đồng hành.
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.