Hướng dẫn này giải thích cách làm cho ứng dụng của bạn luôn bật, cách phản ứng với các trạng thái chuyển đổi nguồn và cách quản lý hành vi của ứng dụng để mang lại trải nghiệm tốt cho người dùng trong khi tiết kiệm pin.
Việc cho phép một ứng dụng liên tục xuất hiện sẽ ảnh hưởng đáng kể đến thời lượng pin, vì vậy bạn hãy cân nhắc mức tiêu thụ điện năng khi thêm tính năng này.
Khái niệm chính
Khi một ứng dụng Wear OS hiển thị ở chế độ toàn màn hình, ứng dụng sẽ ở một trong hai trạng thái nguồn sau:
- Tương tác: Trạng thái công suất cao khi màn hình ở độ sáng tối đa, cho phép người dùng tương tác đầy đủ.
- Môi trường xung quanh: Trạng thái tiêu thụ ít điện năng, trong đó màn hình sẽ mờ đi để tiết kiệm pin. Ở trạng thái này, giao diện người dùng của ứng dụng vẫn chiếm toàn màn hình, nhưng hệ thống có thể thay đổi giao diện bằng cách làm mờ hoặc phủ nội dung lên trên, chẳng hạn như thời gian. Đây còn được gọi là Chế độ môi trường xung quanh.
Hệ điều hành kiểm soát quá trình chuyển đổi giữa các trạng thái này.
Ứng dụng luôn bật là ứng dụng hiển thị nội dung ở cả trạng thái Tương tác và Môi trường xung quanh.
Khi một ứng dụng luôn bật tiếp tục hiển thị giao diện người dùng của riêng ứng dụng trong khi thiết bị ở trạng thái Môi trường xung quanh có mức sử dụng điện năng thấp, ứng dụng đó được mô tả là đang ở chế độ ambiactive.
Quá trình chuyển đổi hệ thống và hành vi mặc định
Khi một ứng dụng chạy ở nền trước, hệ thống sẽ quản lý các quá trình chuyển đổi trạng thái nguồn dựa trên 2 khoảng thời gian chờ do người dùng không hoạt động kích hoạt.
- Hết thời gian chờ 1: Trạng thái Tương tác sang trạng thái Môi trường xung quanh: Sau một khoảng thời gian không hoạt động, thiết bị sẽ chuyển sang trạng thái Môi trường xung quanh.
- Thời gian chờ #2: Trở về mặt đồng hồ: Sau một khoảng thời gian không hoạt động nữa, hệ thống có thể ẩn ứng dụng hiện tại và hiển thị mặt đồng hồ.
Ngay sau khi hệ thống chuyển đổi lần đầu tiên sang trạng thái Môi trường xung quanh, hành vi mặc định sẽ phụ thuộc vào phiên bản Wear OS và cấu hình của ứng dụng:
- Trên Wear OS 5 trở xuống, hệ thống sẽ hiển thị ảnh chụp màn hình bị mờ của ứng dụng đang tạm dừng, với thời gian được phủ lên trên.
- Trên Wear OS 6 trở lên, nếu một ứng dụng nhắm đến SDK 36 trở lên, thì ứng dụng đó được coi là luôn bật. Màn hình sẽ mờ đi, nhưng ứng dụng vẫn tiếp tục chạy và vẫn hiển thị. (Thông tin cập nhật có thể không thường xuyên, chẳng hạn như một lần mỗi phút.)
Tuỳ chỉnh hành vi cho trạng thái Môi trường xung quanh
Bất kể hành vi mặc định của hệ thống là gì, trên tất cả các phiên bản Wear OS, bạn đều có thể tuỳ chỉnh giao diện hoặc hành vi của ứng dụng khi ở trạng thái Môi trường xung quanh bằng cách sử dụng AmbientLifecycleObserver
để theo dõi các lệnh gọi lại khi chuyển đổi trạng thái.
Sử dụng AmbientLifecycleObserver
Để phản ứng với các sự kiện ở chế độ môi trường xung quanh, hãy sử dụng lớp AmbientLifecycleObserver
:
Triển khai giao diện
AmbientLifecycleObserver.AmbientLifecycleCallback
. Sử dụng phương thứconEnterAmbient()
để điều chỉnh giao diện người dùng cho trạng thái tiêu thụ ít điện năng vàonExitAmbient()
để khôi phục giao diện người dùng về chế độ hiển thị tương tác đầy đủ.val ambientCallback = object : AmbientLifecycleObserver.AmbientLifecycleCallback { override fun onEnterAmbient(ambientDetails: AmbientLifecycleObserver.AmbientDetails) { // ... Called when moving from interactive mode into ambient mode. // Adjust UI for low-power state: dim colors, hide non-essential elements. } override fun onExitAmbient() { // ... Called when leaving ambient mode, back into interactive mode. // Restore full UI. } override fun onUpdateAmbient() { // ... Called by the system periodically (typically once per minute) // to allow the app to update its display while in ambient mode. } }
Tạo một
AmbientLifecycleObserver
và đăng ký đối tượng này với vòng đời của hoạt động hoặc thành phần kết hợp.private val ambientObserver = AmbientLifecycleObserver(activity, ambientCallback) override fun onCreate(savedInstanceState: Bundle) { super.onCreate(savedInstanceState) lifecycle.addObserver(ambientObserver) // ... }
Gọi
removeObserver()
để xoá đối tượng tiếp nhận dữ liệu trongonDestroy()
.
Đối với những nhà phát triển sử dụng Jetpack Compose, thư viện Horologist cung cấp một tiện ích hữu ích là thành phần kết hợp AmbientAware
, giúp đơn giản hoá việc triển khai mẫu này.
TimeText thích ứng với môi trường xung quanh
Là một trường hợp ngoại lệ đối với yêu cầu về đối tượng tiếp nhận dữ liệu tuỳ chỉnh, trên Wear OS 6, tiện ích TimeText
có thể nhận biết môi trường xung quanh. Ứng dụng này tự động cập nhật mỗi phút một lần khi thiết bị ở trạng thái Môi trường xung quanh mà không cần thêm mã.
Kiểm soát thời lượng bật màn hình
Các phần sau đây mô tả cách quản lý thời gian ứng dụng của bạn xuất hiện trên màn hình.
Ngăn người dùng quay lại mặt đồng hồ khi có Hoạt động đang diễn ra
Sau một khoảng thời gian ở trạng thái Môi trường xung quanh (Hết thời gian chờ #2), hệ thống thường sẽ quay lại mặt đồng hồ. Người dùng có thể định cấu hình khoảng thời gian chờ trong phần cài đặt hệ thống. Đối với một số trường hợp sử dụng, chẳng hạn như khi người dùng theo dõi một bài tập thể dục, ứng dụng có thể cần duy trì trạng thái hiển thị lâu hơn.
Trên Wear OS 5 trở lên, bạn có thể ngăn chặn điều này bằng cách triển khai một OngoingActivity (Hoạt động đang diễn ra). Nếu ứng dụng của bạn đang hiển thị thông tin về một tác vụ đang diễn ra của người dùng (chẳng hạn như một phiên tập thể dục), thì bạn có thể dùng Ongoing Activity API để giữ cho ứng dụng của bạn hiển thị cho đến khi tác vụ kết thúc. Nếu người dùng tự quay lại mặt đồng hồ, chỉ báo hoạt động đang diễn ra sẽ cung cấp cách thức một lần nhấn để họ quay lại ứng dụng của bạn
Để triển khai việc này, ý định chạm của thông báo hiển thị liên tục phải trỏ đến hoạt động luôn bật của bạn, như minh hoạ trong đoạn mã sau:
private fun createNotification(): Notification { val activityIntent = Intent(this, AlwaysOnActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_SINGLE_TOP } val pendingIntent = PendingIntent.getActivity( this, 0, activityIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) val notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID) // ... // ... .setOngoing(true) // ... val ongoingActivity = OngoingActivity.Builder(applicationContext, NOTIFICATION_ID, notificationBuilder) // ... // ... .setTouchIntent(pendingIntent) .build() ongoingActivity.apply(applicationContext) return notificationBuilder.build() }
Giữ màn hình luôn bật và ngăn Chế độ hiển thị thông minh
Trong một số ít trường hợp, bạn có thể cần ngăn hoàn toàn thiết bị chuyển sang trạng thái Môi trường xung quanh. Tức là để tránh Lỗi hết thời gian chờ số 1. Để làm việc này, bạn có thể sử dụng cờ cửa sổ FLAG_KEEP_SCREEN_ON
. Hàm này hoạt động như một khoá đánh thức, giữ thiết bị ở trạng thái Tương tác. Hãy sử dụng tính năng này một cách thận trọng vì nó ảnh hưởng nghiêm trọng đến thời lượng pin.
Đề xuất cho Chế độ môi trường xung quanh
Để mang lại trải nghiệm tốt nhất cho người dùng và tiết kiệm pin ở chế độ Môi trường xung quanh, hãy tuân thủ các nguyên tắc thiết kế này. Những đề xuất này ưu tiên trải nghiệm rõ ràng cho người dùng bằng cách ngăn chặn thông tin gây hiểu lầm và giảm bớt sự lộn xộn về hình ảnh, đồng thời tối ưu hoá sức mạnh hiển thị.
- Giảm tình trạng rối mắt và mức tiêu thụ điện năng của màn hình. Giao diện người dùng tối giản, gọn gàng cho người dùng biết rằng ứng dụng đang ở trạng thái tiêu thụ ít năng lượng và tiết kiệm đáng kể pin bằng cách giới hạn các pixel sáng.
- Giữ ít nhất 85% màn hình ở trạng thái màu đen.
- Chỉ hiển thị thông tin quan trọng nhất, di chuyển các chi tiết thứ cấp sang màn hình tương tác.
- Sử dụng đường viền cho các biểu tượng hoặc nút lớn thay vì sử dụng màu tô đồng nhất.
- Tránh sử dụng các khối màu đồng nhất lớn và hình ảnh thương hiệu hoặc hình nền không có chức năng.
- Xử lý dữ liệu động lỗi thời
- Lệnh gọi lại
onUpdateAmbient()
chỉ được gọi định kỳ (thường là một lần mỗi phút) để tiết kiệm pin. Do hạn chế này, mọi dữ liệu thay đổi thường xuyên (chẳng hạn như đồng hồ bấm giờ, nhịp tim hoặc khoảng cách tập luyện) sẽ trở nên cũ giữa các lần cập nhật. Để tránh hiển thị thông tin sai lệch và không chính xác, hãy lắng nghe lệnh gọi lạionEnterAmbient
và thay thế các giá trị trực tiếp này bằng nội dung giữ chỗ tĩnh, chẳng hạn như--
.
- Lệnh gọi lại
- Duy trì bố cục nhất quán
- Giữ các phần tử ở cùng một vị trí trong cả chế độ Tương tác và Môi trường xung quanh để tạo hiệu ứng chuyển đổi mượt mà.
- Luôn hiển thị thời gian.
- Nắm bắt bối cảnh
- Nếu người dùng đang ở trên màn hình cài đặt hoặc cấu hình khi thiết bị chuyển sang chế độ môi trường xung quanh, hãy cân nhắc việc hiển thị một màn hình phù hợp hơn trong ứng dụng của bạn thay vì chế độ xem cài đặt.
- Xử lý các yêu cầu cụ thể theo thiết bị
- Trong đối tượng
AmbientDetails
được truyền đếnonEnterAmbient()
:- Nếu
deviceHasLowBitAmbient
làtrue
, hãy tắt tính năng khử răng cưa khi có thể. - Nếu
burnInProtectionRequired
làtrue
, hãy định kỳ dịch chuyển nhẹ các phần tử giao diện người dùng và tránh các vùng màu trắng đồng nhất để ngăn hiện tượng lưu ảnh trên màn hình.
- Nếu
- Trong đối tượng
Gỡ lỗi và thử nghiệm
Các lệnh adb
này có thể hữu ích khi phát triển hoặc kiểm thử cách ứng dụng của bạn hoạt động khi thiết bị ở chế độ xung quanh:
# put device in ambient mode if the always on display is enabled in settings
# (and not disabled by other settings, such as theatre mode)
$ adb shell input keyevent KEYCODE_SLEEP
# put device in interactive mode
$ adb shell input keyevent KEYCODE_WAKEUP
Ví dụ: Ứng dụng tập luyện
Hãy cân nhắc một ứng dụng tập thể dục cần hiển thị các chỉ số cho người dùng trong toàn bộ thời gian của phiên tập thể dục. Ứng dụng phải luôn hiển thị trong quá trình chuyển đổi trạng thái Môi trường xung quanh và tránh bị mặt đồng hồ thay thế.
Để đạt được điều này, nhà phát triển cần làm như sau:
- Triển khai một
AmbientLifecycleObserver
để xử lý các thay đổi về giao diện người dùng giữa các trạng thái Tương tác và Môi trường xung quanh, chẳng hạn như làm mờ màn hình và xoá dữ liệu không cần thiết. - Tạo một bố cục mới có mức sử dụng điện năng thấp cho trạng thái Môi trường xung quanh theo các phương pháp hay nhất.
- Sử dụng Ongoing Activity API trong suốt thời gian tập luyện để ngăn hệ thống quay lại mặt đồng hồ.
Để xem cách triển khai đầy đủ, hãy xem Mẫu bài tập thể dục dựa trên Compose trên GitHub. Mẫu này cũng minh hoạ cách sử dụng thành phần kết hợp AmbientAware
trong thư viện Horologist để đơn giản hoá việc xử lý chế độ môi trường xung quanh trong Compose.