Thay đổi về hành vi: tất cả ứng dụng

Nền tảng Android 13 có các thay đổi về hành vi có thể ảnh hưởng đến ứng dụng của bạn. Những thay đổi sau đây về hành vi sẽ áp dụng cho tất cả ứng dụng khi chúng chạy trên Android 13, bất kể targetSdkVersion. Bạn nên kiểm thử ứng dụng rồi sửa đổi để hỗ trợ những thay đổi này cho phù hợp (nếu cần).

Ngoài ra, hãy nhớ tham khảo danh sách thay đổi về hành vi chỉ ảnh hưởng đến những ứng dụng nhắm đến Android 13.

Hiệu suất và pin

Trình quản lý tác vụ

Ở cuối ngăn thông báo là một nút cho biết số lượng ứng dụng hiện đang chạy trong nền. Khi bạn nhấn nút này, một hộp thoại sẽ xuất hiện và liệt kê tên của các ứng dụng. Nút Dừng
  nằm ở bên phải của mỗi ứng dụng
Hình 1. Quy trình công việc cho Trình quản lý tác vụ , cho phép người dùng dừng các ứng dụng đang có dịch vụ trên nền trước. Quy trình công việc này chỉ xuất hiện trên các thiết bị chạy Android 13 trở lên.

Kể từ Android 13 (API cấp 33), người dùng có thể hoàn tất quy trình công việc qua ngăn thông báo để dừng các ứng dụng đang có dịch vụ trên nền trước, như minh hoạ trong hình 1. Thành phần này được gọi là Task Manager (Trình quản lý tác vụ). Ứng dụng phải có khả năng xử lý yêu cầu dừng do người dùng khởi tạo này.

Cải thiện quá trình xử lý công việc tìm nạp trước bằng JobScheduler

JobScheduler cung cấp một phương thức để ứng dụng đánh dấu các công việc cụ thể là công việc "tìm nạp trước" (bằng cách sử dụng JobInfo.Builder.setPrefetch()), tức là lý tưởng nhất là các công việc đó nên chạy gần và trước lần chạy ứng dụng tiếp theo để cải thiện trải nghiệm người dùng. Trước đây, JobScheduler chỉ sử dụng tín hiệu để cho phép các công việc tìm nạp trước có cơ hội sử dụng dữ liệu trống hoặc dư thừa.

Trong Android 13 (API cấp 33) trở lên, hệ thống sẽ cố gắng xác định lần chạy ứng dụng tiếp theo và sử dụng thông tin ước tính đó để chạy các công việc tìm nạp trước. Các ứng dụng nên cố gắng sử dụng công việc tìm nạp trước cho mọi công việc mà chúng muốn thực hiện trước lần chạy ứng dụng tiếp theo.

Sử dụng tài nguyên pin

Android 13 (API cấp 33) cung cấp các cách sau đây để hệ thống có thể quản lý thời lượng pin của thiết bị một cách hiệu quả hơn:

Khi bạn kiểm thử ứng dụng với các thay đổi này, hãy nhớ kiểm tra những mục sau:

  • Kiểm thử cách ứng dụng của bạn phản hồi khi hệ thống đặt ứng dụng đó vào Bộ chứa chế độ chờ ứng dụng"bị hạn chế". Hãy sử dụng lệnh Cầu gỡ lỗi Android (ADB) sau đây để chỉ định ứng dụng của bạn cho bộ chứa này:

    adb shell am set-standby-bucket PACKAGE_NAME restricted
    
  • Hãy kiểm thử cách ứng dụng của bạn phản hồi các hạn chế sau đây thường áp dụng cho các ứng dụng có trạng thái"bị hạn chế" về mức sử dụng pin ở chế độ nền:

    • Không thể khởi chạy dịch vụ trên nền trước
    • Các dịch vụ trên nền trước hiện có sẽ bị xoá khỏi nền trước
    • Chuông báo không được kích hoạt
    • Công việc không được thực thi

    Sử dụng lệnh ADB sau đây để đặt ứng dụng của bạn ở trạng thái "bị hạn chế" này:

    adb shell cmd appops set PACKAGE_NAME RUN_ANY_IN_BACKGROUND ignore
    

Hạn mức đối với giải pháp Tin nhắn qua đám mây của Firebase (FCM) có mức độ ưu tiên cao

Android 13 (API cấp 33) cập nhật hạn mức Giải pháp gửi thông báo qua đám mây của Firebase (FCM) để cải thiện độ tin cậy của quá trình gửi FCM có mức độ ưu tiên cao cho các ứng dụng hiển thị thông báo để phản hồi các FCM có mức độ ưu tiên cao. Những nội dung sau đây đã thay đổi trong Android 13 (API cấp 33):

  • Nhóm chế độ chờ ứng dụng không còn xác định số lượng FCM có mức độ ưu tiên cao mà một ứng dụng có thể dùng.
  • Hạn mức FCM ưu tiên cao thay đổi tỷ lệ theo số lượng thông báo hiển thị với người dùng tương ứng với FCM có mức độ ưu tiên cao.

Như trong các phiên bản Android trước, những FCM có mức độ ưu tiên cao vượt quá hạn mức sẽ bị hạ cấp xuống mức ưu tiên bình thường. Khi khởi động Dịch vụ trên nền trước (FGS) để phản hồi một FCM, bạn nên kiểm tra kết quả của RemoteMessage.getPriority() và xác nhận kết quả đó là PRIORITY_HIGH và/hoặc xử lý mọi trường hợp ngoại lệ có thể xảy ra ForegroundServiceStartNotAllowedException.

Nếu ứng dụng của bạn không phải lúc nào cũng đăng thông báo phản hồi FCM có mức độ ưu tiên cao thì bạn nên thay đổi mức độ ưu tiên của các FCM này thành bình thường để các thư được gửi đến thông báo không bị hạ cấp.

Quyền riêng tư

Quyền khi bắt đầu chạy cho thông báo

Android 13 (API cấp 33) giới thiệu quyền gửi thông báo khi bắt đầu chạy: POST_NOTIFICATIONS. Thay đổi này giúp người dùng tập trung vào các thông báo quan trọng nhất với họ.

Bạn nên nhắm đến Android 13 trở lên sớm nhất có thể để tận dụng khả năng kiểm soát và tính linh hoạt bổ sung của tính năng này.

Tìm hiểu thêm về các phương pháp hay nhất về quyền cho ứng dụng.

Ẩn nội dung nhạy cảm khỏi bảng nhớ tạm

Nếu ứng dụng của bạn cho phép người dùng sao chép nội dung nhạy cảm (chẳng hạn như mật khẩu hoặc thông tin thẻ tín dụng) vào bảng nhớ tạm, thì bạn phải thêm cờ vào ClipDescription của ClipData trước khi gọi ClipboardManager#setPrimaryClip(). Khi bạn thêm cờ này, nội dung nhạy cảm sẽ không xuất hiện trong bản xem trước nội dung.

Bản xem trước văn bản sao chép không gắn cờ nội dung nhạy cảm
Bản xem trước văn bản sao chép không gắn cờ nội dung nhạy cảm.
Bản xem trước văn bản sao chép có gắn cờ nội dung nhạy cảm.
Bản xem trước văn bản sao chép có gắn cờ nội dung nhạy cảm.

Để gắn cờ nội dung nhạy cảm, hãy thêm một boolean bổ sung vào ClipDescription. Tất cả các ứng dụng đều phải thực hiện việc này, bất kể cấp độ API mục tiêu.


// When your app is compiled with the API level 33 SDK or higher
clipData.apply {
    description.extras = PersistableBundle().apply {
        putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true)
    }
}

// If your app is compiled with a lower SDK
clipData.apply {
    description.extras = PersistableBundle().apply {
        putBoolean("android.content.extra.IS_SENSITIVE", true)
    }
}

Để tìm hiểu thêm về giao diện người dùng của bảng nhớ tạm mới, hãy truy cập trang tính năng Sao chép và dán.

Bảo mật

Di chuyển khỏi mã nhận dạng người dùng chung

Nếu ứng dụng của bạn dùng thuộc tính android:sharedUserId không còn phụ thuộc vào chức năng của thuộc tính này, thì bạn có thể đặt thuộc tính android:sharedUserMaxSdkVersion thành 32, như minh hoạ trong đoạn mã sau:

<manifest ...>
    <!-- To maintain backward compatibility, continue to use
         "android:sharedUserId" if you already added it to your manifest. -->
    android:sharedUserId="SHARED_PACKAGE_NAME"
    android:sharedUserMaxSdkVersion="32"
    ...
</manifest>

Thuộc tính này cho hệ thống biết rằng ứng dụng của bạn không còn dựa vào mã nhận dạng người dùng chung. Nếu ứng dụng của bạn khai báo android:sharedUserMaxSdkVersion và mới được cài đặt trên các thiết bị chạy Android 13 trở lên, thì ứng dụng đó sẽ hoạt động như thể bạn chưa từng xác định android:sharedUserId. Các ứng dụng cập nhật vẫn sử dụng mã nhận dạng người dùng chung hiện có.

Mã nhận dạng người dùng chung gây ra hành vi không xác định trong trình quản lý gói. Thay vào đó, ứng dụng của bạn nên dùng cơ chế giao tiếp thích hợp, chẳng hạn như trình cung cấp nội dung và dịch vụ, để hỗ trợ khả năng tương tác giữa các thành phần dùng chung.

Trải nghiệm người dùng

Thông báo về dịch vụ trên nền trước có thể đóng

Theo mặc định, trên các thiết bị chạy Android 13 trở lên, người dùng có thể đóng các thông báo liên kết với dịch vụ trên nền trước.

Chức năng cốt lõi

Đã xoá bản sao cũ của việc triển khai dịch vụ lời nói

Android 13 xoá phương thức triển khai SpeechService (bao gồm cả Voice IME, RecognitionServiceAPI dựa trên ý định) khỏi ứng dụng Google.

Trên Android 12, các thay đổi sau đã xảy ra:

  • Các chức năng của SpeechService đã được di chuyển sang Dịch vụ lời nói của ứng dụng Google. Ứng dụng này trở thành nhà cung cấp SpeechService mặc định.
  • Chức năng RecognitionService đã được chuyển sang ứng dụng Android System Intelligence để hỗ trợ tính năng nhận dạng lời nói trên thiết bị.

Để giúp duy trì khả năng tương thích của ứng dụng trên Android 12, ứng dụng Google sẽ dùng đàn hồi để chuyển hướng lưu lượng truy cập đến ứng dụng Dịch vụ lời nói của Google. Trong Android 13, đàn hồi này sẽ bị xoá.

Các ứng dụng nên dùng trình cung cấp mặc định của thiết bị cho SpeechService, thay vì mã cứng một ứng dụng cụ thể.