Doze Mode: bản chất, giai đoạn và cơ chế tiết kiệm năng lượng

Tác giả: IT Sectr Đã đăng: 2026-03-28 Thời gian đọc: 10 phút

Doze Mode là một tính năng tiết kiệm năng lượng của Android, được giới thiệu trong phiên bản 6.0 Marshmallow, giúp hạn chế đáng kể hoạt động nền của ứng dụng khi thiết bị không hoạt động. Hệ thống chuyển ứng dụng sang trạng thái tiêu thụ điện năng thấp, trì hoãn các yêu cầu mạng, đồng bộ hóa và JobScheduler để kéo dài tuổi thọ pin. Theo phân tích từ Android Developers, 2025, Doze Mode có thể tăng thời gian chờ của thiết bị lên 2–3 lần tùy theo mẫu máy và phiên bản HĐH.

Các điểm chính

  • Doze Mode — chế độ ngủ Android 6+ hạn chế hoạt động nền khi không hoạt động
  • Hai giai đoạn — Light Doze (ngủ nông) và Deep Doze (ngủ sâu) với các hạn chế khác nhau
  • Cửa sổ bảo trì — khoảng thời gian ngắn khi ứng dụng có thể thực hiện tác vụ trong Deep Doze
  • Danh sách cho phép — ngoại lệ cho ứng dụng được phép hoạt động nền trong Doze
  • GCM/FCM — thông báo push ưu tiên cao đánh thức thiết bị từ Doze

Doze Mode là gì

Doze Mode là một cơ chế tiết kiệm năng lượng tích hợp của Android, kích hoạt khi thiết bị không kết nối với bộ sạc, màn hình tắt và người dùng không tương tác với thiết bị trong một khoảng thời gian nhất định. Mục tiêu của Doze là giảm thiểu hoạt động nền của ứng dụng để tối đa hóa tuổi thọ pin ở chế độ chờ. Hệ thống trì hoãn JobScheduler, đồng bộ hóa tài khoản, AlarmManager và các yêu cầu mạng.

Chế độ này được giới thiệu trong Android 6.0 Marshmallow (API 23) và được cải thiện đáng kể trong các phiên bản sau. Android 7.0 Nougat đã giới thiệu giai đoạn thứ hai (Light Doze) kích hoạt khi thiết bị di chuyển. Android 8.0 đã thêm các hạn chế bổ sung đối với các dịch vụ nền hoạt động cùng với Doze. Trong Android 12+, Doze đã được tích hợp với hệ thống quản lý pin được cập nhật phân tích hành vi người dùng.

Điều quan trọng cần hiểu: Doze Mode không vô hiệu hóa hoàn toàn các ứng dụng. Nó chuyển chúng sang trạng thái có các tác vụ bị trì hoãn, nhưng không kết thúc tiến trình. Foreground Service với thông báo tiếp tục hoạt động, thông báo push ưu tiên cao (FCM high-priority) được gửi đến và báo thức hoạt động theo lịch. Doze chỉ ảnh hưởng đến các thao tác nền mà người dùng không nhìn thấy hoặc không mong đợi tại thời điểm đó.

Điều kiện kích hoạt

Doze Mode kích hoạt khi tất cả các điều kiện được đáp ứng: màn hình tắt hơn 30 phút (lần kích hoạt đầu tiên), thiết bị đứng yên (sử dụng cảm biến gia tốc), không kết nối với bộ sạc. Nếu người dùng cầm điện thoại lên hoặc cắm sạc, Doze sẽ ngay lập tức bị hủy kích hoạt. Trong Android 7+, Light Doze kích hoạt sau chỉ 5 phút không hoạt động, ngay cả khi thiết bị đang di chuyển.

Cách Doze Mode hoạt động

Doze Mode quản lý hoạt động nền thông qua dịch vụ hệ thống DeviceIdleController, phân tích trạng thái của cảm biến, màn hình và bộ sạc. Khi tất cả các điều kiện kích hoạt được đáp ứng, hệ thống chuyển ứng dụng sang chế độ chờ, nhóm các yêu cầu của chúng vào các cửa sổ bảo trì. Bên trong các cửa sổ này, tất cả các tác vụ bị trì hoãn — cuộc gọi mạng, đồng bộ hóa, AlarmManager — được thực hiện theo lô.

PowerManager của hệ thống kiểm soát ứng dụng nào có thể thoát khỏi Doze. Thông báo push ưu tiên cao (FCM high-priority) có thể đánh thức thiết bị để gửi tin nhắn. Hệ thống cũng bỏ qua Doze cho các ứng dụng được người dùng thêm vào Danh sách cho phép tối ưu hóa pin. Tất cả các ứng dụng khác phải chờ cửa sổ bảo trì tiếp theo.

Thời gian của các cửa sổ bảo trì trong Deep Doze tăng theo cấp số nhân: cửa sổ đầu tiên sau 1 giờ, cửa sổ thứ hai sau 2 giờ, cửa sổ thứ ba sau 4 giờ, và cứ như vậy cho đến khoảng thời gian tối đa là 12 giờ. Điều này có nghĩa là thiết bị ở trong Doze càng lâu, ứng dụng càng hiếm khi có thể thực hiện các tác vụ nền — tiết kiệm pin một cách tối đa.

Ảnh hưởng đến các yêu cầu mạng

Trong Doze Mode, tất cả các yêu cầu mạng bị tạm dừng cho đến khi mở cửa sổ bảo trì. Các ngoại lệ duy nhất là tin nhắn FCM ưu tiên cao (có thẻ “high_priority” trong tải trọng) và tín hiệu từ AlarmManager với cờ setAndAllowWhileIdle() hoặc setExactAndAllowWhileIdle(). Các cuộc gọi mạng thông thường qua Retrofit, OkHttp hoặc Volley sẽ không được thực hiện cho đến khi một cửa sổ mở ra.

Các giai đoạn của Doze Mode

Doze Mode bao gồm hai giai đoạn: Light Doze (ngủ nông) và Deep Doze (ngủ sâu). Mỗi giai đoạn áp dụng các hạn chế riêng và có các ngưỡng kích hoạt khác nhau. Hiểu được sự khác biệt giữa các giai đoạn là rất quan trọng đối với nhà phát triển thiết kế các tác vụ nền có khả năng chống chịu với chế độ tiết kiệm năng lượng.

Light Doze (ngủ nông)

Light Doze kích hoạt sau 5–30 phút thiết bị không hoạt động (màn hình tắt, không có chuyển động). Trong giai đoạn này, các yêu cầu mạng và đồng bộ hóa bị tạm dừng, nhưng AlarmManager và JobScheduler tiếp tục hoạt động với độ trễ nhỏ. Ứng dụng có thể thoát khỏi Light Doze khi nhận được thông báo push hoặc khi kết nối với bộ sạc. Light Doze không yêu cầu sự bất động hoàn toàn — thiết bị có thể đang di chuyển.

Deep Doze (ngủ sâu)

Deep Doze xảy ra sau 60–90 phút không hoạt động với thiết bị đứng yên (cảm biến gia tốc không phát hiện chuyển động). Trong Deep Doze, hệ thống tích cực hơn đáng kể trong việc trì hoãn các tác vụ: cửa sổ bảo trì mở ít thường xuyên hơn (với khoảng thời gian tăng theo cấp số nhân), AlarmManager chỉ hoạt động với cờ setAndAllowWhileIdle() và WakeLock không hoạt động theo cách thông thường. Các ứng dụng không nằm trong Danh sách cho phép hầu như bị tước hoàn toàn hoạt động nền.

Tham sốLight DozeDeep Doze
Thời gian kích hoạt5–30 phút60–90 phút
Yêu cầu chuyển độngKhông yêu cầuĐứng yên
Khoảng cách cửa sổ10–60 phút1–12 giờ
AlarmManagerHoạt động có độ trễChỉ withAllowWhileIdle
Mạng trong cửa sổCó sẵnCó sẵn

Hạn chế trong Doze Mode

Doze Mode áp dụng một số loại hạn chế mà nhà phát triển phải xem xét khi thiết kế ứng dụng. Bỏ qua các hạn chế này dẫn đến các tác vụ nền không được thực hiện và người dùng thấy hành vi ứng dụng không chính xác — thiếu bản cập nhật, tin nhắn không được gửi, đồng bộ hóa không hoàn chỉnh.

Hạn chế mạng

Tất cả các yêu cầu mạng bị chặn cho đến khi mở cửa sổ bảo trì. Điều này áp dụng cho các cuộc gọi HTTP, kết nối WebSocket và tải tệp. Ngoại lệ là các tin nhắn FCM ưu tiên cao, đi qua kênh riêng của Google Play Services độc lập với Doze. Để đồng bộ hóa dữ liệu quan trọng, nên sử dụng WorkManager với chính sách NetworkType.CONNECTED.

Hạn chế AlarmManager

AlarmManager trong Deep Doze trì hoãn tất cả các báo thức ngoại trừ những báo thức được tạo bằng phương thức setAndAllowWhileIdle()setExactAndAllowWhileIdle(). Tuy nhiên, ngay cả các phương thức này cũng có giới hạn — không quá 1 lần kích hoạt trong 9 phút cho mỗi ứng dụng. Các báo thức chính xác với setExact() trong Deep Doze không đảm bảo kích hoạt đúng thời gian chị định.

Hạn chế WakeLock

WakeLock hoạt động không bình thường trong Doze Mode: hệ thống không giữ khóa đánh thức cho các ứng dụng bên ngoài Danh sách cho phép. Ngay cả khi một ứng dụng đã có được PARTIAL_WAKE_LOCK một cách chính xác, khi Deep Doze bắt đầu, hệ thống có thể giải phóng nó một cách cưỡng bức. Cách duy nhất để đảm bảo thực hiện tác vụ trong Doze là sử dụng Foreground Service với thông báo.

  • Mạng — tất cả yêu cầu bị trì hoãn đến cửa sổ bảo trì, trừ FCM high-priority
  • AlarmManager — báo thức chính xác bị trì hoãn; setAndAllowWhileIdle — không quá 1/9 phút
  • WakeLock — bị giải phóng cưỡng bức cho ứng dụng ngoài Danh sách cho phép
  • JobScheduler — các tác vụ được nhóm trong cửa sổ bảo trì với khoảng cách theo cấp số nhân
  • Đồng bộ hóa — Account SyncManager tạm dừng cho đến khi thoát khỏi Doze

Danh sách cho phép và ngoại lệ

Danh sách cho phép của Doze là danh sách các ứng dụng mà hệ thống cho phép hoạt động nền trong chế độ tiết kiệm năng lượng với các hạn chế tối thiểu. Người dùng có thể thêm ứng dụng vào danh sách theo cách thủ công qua Cài đặt → Pin → Tối ưu hóa pin. Các ứng dụng hệ thống, trình khởi chạy và Google Play Services nằm trong Danh sách cho phép theo mặc định.

Nhà phát triển có thể yêu cầu thêm vào Danh sách cho phép thông qua hộp thoại hệ thống với Intent ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS. Điều này yêu cầu quyền REQUEST_IGNORE_BATTERY_OPTIMIZATIONS trong tệp kê khai. Tuy nhiên, Google không khuyến nghị yêu cầu ngoại lệ mà không có lý do chính đáng — các ứng dụng lạm dụng khả năng này có nguy cơ bị từ chối khi xuất bản trên Google Play.

Không có Danh sách cho phép, ứng dụng có thể sử dụng FCM ưu tiên cao để đánh thức thiết bị từ Doze. Mỗi tin nhắn như vậy cho ứng dụng một cửa sổ ngắn (10–30 giây) để thực hiện tác vụ. Đối với các thao tác dài hơn, ứng dụng phải khởi động Foreground Service, tiếp tục hoạt động trong các cửa sổ bảo trì của Doze. Google cũng cung cấp cơ chế miễn trừ cho một số loại ứng dụng: dẫn đường, y tế, nhắn tin.

Cách kiểm tra trạng thái Danh sách cho phép

Để kiểm tra xem ứng dụng có trong Danh sách cho phép tối ưu hóa pin hay không, hãy sử dụng phương thức powerManager.isIgnoringBatteryOptimizations(). Nếu phương thức trả về false, ứng dụng phải tuân thủ tất cả các hạn chế của Doze. Nếu trả về true, ứng dụng có thể sử dụng Wakelock, AlarmManager và mạng mà không bị hạn chế ngay cả trong Deep Doze. Tuy nhiên, lạm dụng đặc quyền này sẽ dẫn đến các đánh giá xấu từ người dùng.

Kiểm thử Doze Mode

Kiểm thử hành vi ứng dụng trong Doze Mode là một bước phát triển bắt buộc vì Doze có thể làm gián đoạn các chức năng nền. Android cung cấp các công cụ dòng lệnh thông qua ADB để buộc thiết bị chuyển sang Light Doze và Deep Doze. Việc kiểm thử phải được thực hiện trên thiết bị thật hoặc trình giả lập có Android 6.0+.

Để vào Light Doze, sử dụng lệnh adb shell dumpsys deviceidle step light. Đối với Deep Doze — adb shell dumpsys deviceidle step deep. Lệnh adb shell dumpsys deviceidle force-idle deep chuyển ngay lập tức thiết bị sang Deep Doze mà không cần chờ thời gian chờ tiêu chuẩn. Sau khi kiểm thử, thoát khỏi Doze bằng lệnh adb shell dumpsys deviceidle unforce.

bash
# Buộc vào Light Doze
$ adb shell dumpsys deviceidle step light

# Buộc vào Deep Doze
$ adb shell dumpsys deviceidle step deep

# Chuyển ngay sang Deep Doze
$ adb shell dumpsys deviceidle force-idle deep

# Thoát khỏi Doze
$ adb shell dumpsys deviceidle unforce

# Xem trạng thái Doze
$ adb shell dumpsys deviceidle

Kiểm tra hoạt động của ứng dụng

Sau khi chuyển sang Doze Mode, hãy kiểm tra: các yêu cầu mạng có hoạt động không (chúng sẽ bị trì hoãn), AlarmManager có kích hoạt không, tin nhắn FCM có được gửi không, các tác vụ WorkManager có thực hiện chính xác không. WorkManager tiếp tục hoạt động trong Doze: các tác vụ của nó được thực hiện trong các cửa sổ bảo trì. Tuy nhiên, nếu một tác vụ yêu cầu thực hiện ngay lập tức, hãy chỉ định setExpedited() hoặc sử dụng Foreground Service.

Các thực hành tốt nhất cho Doze Mode

Phát triển ứng dụng có khả năng chống chịu với Doze Mode đòi hỏi phải xem xét lại cách tiếp cận các tác vụ nền. Google khuyến nghị thiết kế ứng dụng để hoạt động chính xác dưới mọi hạn chế của Doze mà không phụ thuộc vào việc thực hiện ngay lập tức các thao tác nền. Nguyên tắc cơ bản là sử dụng WorkManager cho tất cả các tác vụ nền có thể bị trì hoãn.

Sử dụng WorkManager

WorkManager là API được Google khuyến nghị cho các tác vụ nền vì nó tự động thích ứng với Doze. WorkManager sử dụng JobScheduler (API 23+) hoặc AlarmManager + BroadcastReceiver trên các phiên bản cũ. Các tác vụ WorkManager được thực hiện trong cửa sổ bảo trì Doze gần nhất hoặc ngay lập tức nếu cần thông qua Expedited Work (Foreground Service bên dưới).

Foreground Service cho các tác vụ quan trọng

Nếu một tác vụ không thể bị trì hoãn (phát lại phương tiện, dẫn đường, VoIP), hãy sử dụng Foreground Service với thông báo bắt buộc. Foreground Service được miễn trừ khỏi Doze: nó có thể giữ WakeLock và thực hiện các yêu cầu mạng. Tuy nhiên, ngay cả Foreground Service cũng phải tuân thủ các chính sách cửa sổ bảo trì Deep Doze đối với một số loại tác vụ — ví dụ, dataSync.

FCM ưu tiên cao cho thông báo

Để gửi các tin nhắn yêu cầu sự chú ý ngay lập tức (cuộc gọi đến, thông báo khẩn cấp), hãy sử dụng tin nhắn FCM ưu tiên cao. Các tin nhắn này đánh thức thiết bị từ Doze và cho ứng dụng một cửa sổ ngắn để xử lý. Không sử dụng ưu tiên cao cho các thông báo thông thường — điều này sẽ làm pin hao nhanh và có thể bị coi là vi phạm chính sách của Google Play.

  • WorkManager — API ưu tiên cho tất cả các tác vụ nền có thể trì hoãn
  • Foreground Service — cho các tác vụ quan trọng với thông báo hiển thị
  • FCM ưu tiên cao — để gửi tin nhắn khẩn cấp kèm đánh thức thiết bị
  • Đừng yêu cầu Danh sách cho phép nếu không thật sự cần thiết — điều này làm xấu trải nghiệm người dùng
  • Kiểm thử ứng dụng trong Light và Deep Doze qua ADB trước khi phát hành

Câu hỏi thường gặp

Doze Mode trong Android là gì?

Doze Mode là chế độ tiết kiệm năng lượng Android 6+ hạn chế hoạt động nền của ứng dụng khi thiết bị không được sử dụng (màn hình tắt, không có chuyển động). Hệ thống trì hoãn các yêu cầu mạng, đồng bộ hóa và JobScheduler, nhóm chúng thành các cửa sổ bảo trì để tiết kiệm pin.

Doze Mode có những giai đoạn nào?

Doze Mode có hai giai đoạn: Light Doze (ngủ nông) kích hoạt sau 5–30 phút, cho phép AlarmManager hoạt động với độ trễ. Deep Doze (ngủ sâu) xảy ra sau 60–90 phút bất động, tích cực hạn chế các tác vụ nền với cửa sổ bảo trì lên đến 12 giờ.

Doze áp dụng những hạn chế nào cho ứng dụng?

Doze chặn các yêu cầu mạng, trì hoãn AlarmManager (trừ setAndAllowWhileIdle), giải phóng WakeLock cưỡng bức và nhóm JobScheduler thành các cửa sổ bảo trì. Các ngoại lệ bao gồm Foreground Service, FCM ưu tiên cao và ứng dụng trong Danh sách cho phép của người dùng.

Làm thế nào để thêm ứng dụng vào Danh sách cho phép Doze?

Yêu cầu quyền REQUEST_IGNORE_BATTERY_OPTIMIZATIONS trong tệp kê khai và gửi Intent với hành động ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS. Hệ thống sẽ hiển thị hộp thoại cho người dùng. Việc thêm vào Danh sách cho phép là một đặc quyền mà Google khuyến nghị chỉ sử dụng cho các ứng dụng quan trọng.

Làm thế nào để kiểm thử ứng dụng trong Doze Mode?

Sử dụng các lệnh ADB: adb shell dumpsys deviceidle force-idle deep để vào Deep Doze, adb shell dumpsys deviceidle step light cho Light Doze, adb shell dumpsys deviceidle unforce để thoát. Kiểm tra WorkManager, AlarmManager và FCM trong từng chế độ.

Tổng kết

  • Doze Mode — chế độ ngủ Android 6+ kích hoạt khi thiết bị không hoạt động để tiết kiệm pin
  • Light Doze — giai đoạn nhẹ sau 5–30 phút, hạn chế một phần AlarmManager và mạng
  • Deep Doze — giai đoạn sâu sau 60–90 phút bất động với cửa sổ bảo trì lên đến 12 giờ
  • Hạn chế — chặn mạng, trì hoãn AlarmManager, giải phóng WakeLock
  • Ngoại lệ — Foreground Service, FCM ưu tiên cao, ứng dụng trong Danh sách cho phép
  • WorkManager — API được khuyến nghị cho các tác vụ nền, tự động thích ứng với Doze
  • Kiểm thử — xác minh bắt buộc qua ADB (dumpsys deviceidle) trước khi phát hành

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm