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

từ khoá: wear,ambient,alwayson

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 đang không dùng đồng hồ. Đây được gọi là chế độ môi trường xung quanh của hệ thống. Nếu người dùng tương tác lại với đồng hồ trong một khung thời gian nhất định, thiết bị Wear OS sẽ đưa người dùng quay lại nơi họ đã dừng lại trong ứng dụng.

Đố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 tiết kiệm pin. 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. Thêm quyền WAKE_LOCK vào tệp kê khai Android:
<uses-permission android:name="android.permission.WAKE_LOCK" />

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

Để sử dụng lớp AmbientLifecycleObserver, hãy làm như sau:

  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.

Ứ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 giao diện hình ảnh ở 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 và để phần lớn màn hình màu đen. 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.
  • Đ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.
  • 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.

Khi sử dụng Compose cho Wear OS, bạn nên sử dụng các phương thức gọi lại này để cập nhật trạng thái, để hệ thống có thể kết hợp lại giao diện người dùng của bạn một cách phù hợp.

Để 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.