Ứng dụng luôn bật và chế độ môi trường xung quanh của hệ thống

Wear OS tự động xử lý việc chuyển sang chế độ tiết kiệm pin cho một ứng dụng đang hoạt động khi người dùng không dùng đồng hồ. Đây được gọi là chế độ môi trường xung quanh của hệ thống. Ứng dụng sẽ tiếp tục sau khi người dùng tương tác với đồng hồ nếu đáp ứng bất kỳ điều kiện nào sau đây:

  • Lượt tương tác của người dùng xảy ra trong một khung thời gian nhất định (trước khi hết thời gian chờ).
  • Ứng dụng khai báo và đã bắt đầu một hoạt động đang diễn ra.

Đối với các trường hợp sử dụng cụ thể, chẳng hạn như người dùng muốn xem nhịp tim và nhịp độ trong khi chạy, bạn cũng có thể kiểm soát nội dung hiện ở chế độ môi trường xung quanh của hệ thống. Các ứng dụng Wear OS chạy ở cả chế độ môi trường xung quanh lẫn chế độ tương tác được gọi là ứng dụng luôn bật.

Việc cho phép một ứng dụng liên tục xuất hiện sẽ ảnh hưởng đến thời lượng pin, vì vậy bạn hãy cân nhắc ảnh hưởng đó khi thêm tính năng này vào ứng dụng.

Định cấu hình dự án

Để hỗ trợ chế độ môi trường xung quanh, hãy làm theo các bước sau:

  1. Tạo hoặc cập nhật dự án của bạn dựa vào cấu hình trên trang Tạo và chạy ứng dụng cho thiết bị đeo.
  2. (Chỉ cần thiết trên Wear OS 4 trở xuống) Thêm quyền WAKE_LOCK vào tệp kê khai Android:
<uses-permission android:name="android.permission.WAKE_LOCK" android:maxSdkVersion="33"/>

Bật chế độ luôn bật

Kể từ Wear OS 6, các ứng dụng có targetSdkVersion được đặt thành 36 trở lên sẽ luôn bật theo mặc định. Những ứng dụng này vẫn hiển thị trong chế độ môi trường xung quanh của hệ thống trong một khoảng thời gian giới hạn mà không cần định cấu hình. Nếu targetSdkVersion của ứng dụng thấp hơn 36 hoặc nếu ứng dụng của bạn cần chạy trên Wear OS 5 trở xuống, hãy sử dụng lớp AmbientLifecycleObserver để ứng dụng luôn bật.

Phản ứng với các sự kiện ở chế độ môi trường xung quanh bằng lớp AmbientLifecycleObserver

Ứng dụng cũng có thể sử dụng lớp AmbientLifecycleObserver để trực tiếp phản hồi các sự kiện của chế độ môi trường xung quanh:

  1. Triển khai giao diện AmbientLifecycleObserver.AmbientLifecycleCallback, như trong ví dụ sau. Ở giai đoạn này, các phương thức sẽ trống, nhưng ở phần sau của hướng dẫn, bạn sẽ thấy thông tin chi tiết về những thay đổi cần đảm bảo đối với hình ảnh để vào và thoát khỏi chế độ môi trường xung quanh.

    Kotlin

    val ambientCallback = object : AmbientLifecycleObserver.AmbientLifecycleCallback {
        override fun onEnterAmbient(ambientDetails: AmbientLifecycleObserver.AmbientDetails) {
        // ... Called when moving from interactive mode into ambient mode.
        }
    
        override fun onExitAmbient() {
        // ... Called when leaving ambient mode, back into interactive mode.
        }
    
        override fun onUpdateAmbient() {
        // ... Called by the system in order to allow the app to periodically
        // update the display while in ambient mode. Typically the system will
        // call this every 60 seconds.
        }
    }
  2. Tạo AmbientLifecycleObserver rồi đăng ký trình quan sát. Thông thường, thuộc tính này sẽ được dùng trong onCreate() hoặc thành phần kết hợp cấp cao nhất nếu sử dụng Compose cho Wear OS, để cho phép bật hành vi luôn bật trong suốt vòng đời hoạt động.

    Kotlin

    private val ambientObserver = AmbientLifecycleObserver(activity, callback)
    
    override fun onCreate(savedInstanceState: Bundle) {
      super.onCreate(savedInstanceState)
      lifecycle.addObserver(observer)
    
      // ...
    }
  3. Xoá trình quan sát bằng cách gọi removeObserver() khi hành vi luôn bật không còn cần thiết nữa. Ví dụ: bạn có thể gọi phương thức này trong phương thức onDestroy() của hoạt động.

Cập nhật văn bản thời gian bằng tiện ích TimeText

Kể từ Wear OS 6, tiện ích TimeText sẽ nhận biết được chế độ môi trường xung quanh. Nếu ứng dụng của bạn chỉ cần cập nhật văn bản thời gian mỗi phút trong chế độ môi trường xung quanh, thì bạn chỉ cần sử dụng tiện ích TimeText mà không cần sử dụng AmbientLifecycleObserver.

Ứng dụng luôn bật có thể chuyển sang chế độ nền

Kể từ Wear OS 5, hệ thống sẽ chuyển các ứng dụng luôn bật sang chế độ nền sau khi các ứng dụng đó hiển thị ở chế độ môi trường xung quanh trong một khoảng thời gian nhất định. Người dùng có thể định cấu hình thời gian chờ trong phần cài đặt hệ thống.

Nếu ứng dụng luôn bật của bạn 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ư phát nhạc hoặc một phiên tập thể dục), thì bạn nên hiển thị hoạt động đang diễn ra cho đến khi tác vụ kết thúc. Để làm như vậy, hãy sử dụng Ongoing Activity API (API Hoạt động đang diễn ra) để đăng một thông báo hiển thị liên tục được liên kết với hoạt động luôn bật của bạn.

Để hệ thống nhận ra hoạt động đang diễn ra, ý định chạm của thông báo đang diễn ra phải trỏ đến hoạt động luôn bật của bạn, như minh hoạ trong đoạn mã sau:

// Create a pending intent that point to your always-on activity
val touchIntent =
    PendingIntent.getActivity(
        context,
        0,
        Intent(context, MyAlwaysOnActivity::class.java),
        PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
    )

val notificationBuilder =
    NotificationCompat.Builder(this, CHANNEL_ID)
    // ...
    .setOngoing(true)

val ongoingActivity =
    OngoingActivity.Builder(
        applicationContext, NOTIFICATION_ID, notificationBuilder
    )
    // ...
    .setTouchIntent(touchIntent)
    .build()

ongoingActivity.apply(applicationContext)

notificationManager.notify(
    NOTIFICATION_ID,
    notificationBuilder.build()
)

Sửa đổi trải nghiệm người dùng ở chế độ môi trường xung quanh

Theo mặc định, khi triển khai chế độ luôn bật, màn hình sẽ không thay đổi giao diện khi đồng hồ chuyển sang chế độ môi trường xung quanh. Bạn có thể sửa đổi hành vi này bằng cách ghi đè các phương thức trong AmbientLifecycleCallback.

Để tiết kiệm pin, hãy làm như sau:

  • Phát sáng ít điểm ảnh hơn. Hãy cân nhắc chỉ hiển thị thông tin quan trọng ở chế độ môi trường xung quanh và cung cấp thêm thông tin chi tiết khi người dùng chuyển sang chế độ tương tác.
  • Giữ ít nhất 85% màn hình màu đen, xoá màu nền và sử dụng đường viền cho các nút và biểu tượng lớn.
  • Tránh hiển thị thông tin không liên quan, chẳng hạn như hình ảnh nền và hình ảnh thương hiệu không mang tính chức năng.
  • Giữ các phần tử ở cùng một vị trí trên chế độ đang hoạt động và chế độ luôn bật, đồng thời luôn hiển thị thời gian.
  • Điều chỉnh mọi nội dung để nhận được các bản cập nhật nhưng ít thường xuyên hơn. Ví dụ: hiện đồng hồ hẹn giờ ở phút gần nhất thay vì giây gần nhất.
  • Xoá hoặc hiển thị giao diện người dùng phần giữ chỗ cho nội dung chữ và số thường xuyên cập nhật, chẳng hạn như khoảng cách hoặc thời gian.
  • Xoá các chỉ báo tiến trình cập nhật thường xuyên, chẳng hạn như cho vòng đếm ngược và phiên phát nội dung nghe nhìn.
  • Khi chuyển sang chế độ luôn bật, nếu trước đó người dùng đã ở màn hình cấu hình hoặc màn hình cài đặt trong ứng dụng, hãy cân nhắc hiển thị một màn hình phù hợp hơn trong ứng dụng.
  • Trong đối tượng AmbientDetails được truyền đến onEnterAmbient():
    • Nếu bạn đặt deviceHasLowBitAmbient, hãy tắt tính năng khử răng cưa khi có thể.
    • Nếu bạn đặt burnInProtectionRequired, hãy chuyển hình ảnh trực quan xung quanh theo định kỳ và tránh các vùng màu trắng đồng nhất.
  • Tránh chạy ảnh động liên tục trong chế độ môi trường xung quanh. Kể từ Wear OS 5.1, trình tạo ảnh động có thể ngừng chạy trong chế độ môi trường xung quanh.

Danh sách kiểm tra để hiển thị không gián đoạn

Có thể có những trường hợp bạn muốn có quyền kiểm soát tối đa đối với màn hình khi thiết bị chuyển qua nhiều trạng thái, chẳng hạn như khi ứng dụng tập thể dục muốn tránh mặt đồng hồ xuất hiện trên màn hình trong khi tập thể dục. Trong các trường hợp này, hãy làm như sau:

  1. Triển khai giao diện AmbientLifecycleObserver.AmbientLifecycleCallback.
  2. Tạo một bố cục mới có mức tiêu thụ điện năng thấp để sử dụng khi thiết bị ở chế độ môi trường xung quanh của hệ thống.
  3. Trong thời gian tập thể dục, hãy triển khai một hoạt động đang diễn ra.

Để biết ví dụ về cách thực hiện việc nà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 sử dụng thành phần kết hợp AmbientAware trong thư viện Horologist.