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 về hành vi sau đây áp dụng cho tất cả ứng dụng chạy trên Android 13, bất kể targetSdkVersion. Bạn nên kiểm thử ứng dụng của mình, sau đó sửa đổi nếu cần để hỗ trợ các thay đổi này đúng cách, nếu có.
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ụ
Kể từ Android 13 (cấp độ API 33), người dùng có thể hoàn tất quy trình làm việc từ ngăn thông báo để dừng các ứng dụng có dịch vụ trên nền trước đang chạy, như minh hoạ trong hình 1. Tính năng này được gọi là Trình quản lý tác vụ. Ứng dụng phải có khả năng xử lý việc dừng do người dùng khởi xướng này.
Cải thiện việc xử lý công việc tìm nạp trước bằng JobScheduler
JobScheduler cung cấp một cách để ứ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()), nghĩa là các công việc này nên chạy
gần và trước lần khởi 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 sử dụng dữ liệu miễn phí hoặc dữ liệu dư thừa.
Trong Android 13 (cấp độ API 33) trở lên, hệ thống sẽ cố gắng xác định thời điểm tiếp theo ứng dụng sẽ được khởi chạy và sử dụng thông tin ước tính đó để chạy các công việc tìm nạp trước. Ứng dụng nên cố gắng sử dụng các công việc tìm nạp trước cho mọi công việc mà ứng dụng muốn hoàn tất trước lần khởi chạy ứng dụng tiếp theo.
Sử dụng tài nguyên pin
Android 13 (cấp độ API 33) cung cấp các cách sau đây để hệ thống quản lý thời lượng pin của thiết bị tốt hơn:
- Các quy tắc cập nhật về thời điểm hệ thống đặt ứng dụng của bạn vào "bị hạn chế" Nhóm chế độ chờ ứng dụng .
- Các giới hạn mới đối với tác vụ mà ứng dụng của bạn có thể thực hiện khi người dùng đặt ứng dụng của bạn ở trạng thái "bị hạn chế" đối với mức sử dụng pin trong nền.
Khi kiểm thử ứng dụng của bạn với những thay đổi này, hãy nhớ kiểm tra những điều 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ị hạn chế" Nhóm chế độ chờ ứng dụng. Sử dụng lệnh Cầu gỡ lỗi Android (ADB) sau đây để chỉ định ứng dụng của bạn cho nhóm này:
adb shell am set-standby-bucket PACKAGE_NAME restricted
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 ở trạng thái "bị hạn chế" đối với việc sử dụng pin trong 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 thông báo qua đám mây của Firebase (FCM) có mức độ ưu tiên cao
Android 13 (cấp độ API 33) cập nhật Giải pháp gửi thông báo qua đám mây của Firebase (FCM) hạn mức để cải thiện độ tin cậy của việc 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 điều sau đây đã thay đổi trong Android 13 (cấp độ API 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à ứng dụng có thể sử dụng.
- Hệ thống hiện hạ cấp các thông báo có mức độ ưu tiên cao nếu phát hiện thấy một ứng dụng liên tục gửi các thông báo có mức độ ưu tiên cao nhưng không hiển thị thông báo.
Giống như trong các phiên bản Android trước, các 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 bắt đầu Dịch vụ trên nền trước (FGS) để phản hồi FCM, bạn nên kiểm tra kết quả của RemoteMessage.getPriority() và xác nhận rằng kết quả đó là PRIORITY_HIGH và/hoặc xử lý mọi ngoại lệ ForegroundServiceStartNotAllowedException tiềm ẩn.
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 các 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ông báo hiển thị 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
notification permission:
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 càng sớm càng tốt để tận dụng các hiệu ứng của tính 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 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(). Việc thêm cờ này sẽ ngăn nội dung nhạy cảm xuất hiện trong bản xem trước nội dung.
Để gắn cờ nội dung nhạy cảm, hãy thêm một boolean bổ sung vào ClipDescription. Mọi ứng dụng đều nên làm việc này, bất kể cấp độ API mục tiêu nào.
// 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 mới của bảng nhớ tạm, hãy truy cập vào 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 được chia sẻ
Nếu ứng dụng của bạn sử dụng thuộc tính không dùng nữa
android:sharedUserId
và 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 được chia sẻ nữa. Nếu ứng dụng của bạn khai báo android:sharedUserMaxSdkVersion và được cài đặt mới trên các thiết bị chạy Android 13 trở lên, thì ứng dụng của bạn sẽ hoạt động như thể bạn chưa bao giờ 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 được chia sẻ 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 sử dụng cơ chế giao tiếp phù hợp, chẳng hạn như nhà cung cấp nội dung và dịch vụ, nhằm 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ể bỏ qua
Trên các thiết bị chạy Android 13 trở lên, người dùng có thể bỏ qua các thông báo được liên kết với dịch vụ trên nền trước theo mặc định.
Chức năng cốt lõi
Đã xoá bản sao cũ của quá trình triển khai dịch vụ lời nói
Android 13 xoá quá trình triển khai SpeechService (bao gồm cả
IME bằng giọng nói, RecognitionService
và API dựa trên ý định) khỏi
ứng dụng Google.
Trong Android 12, những thay đổi sau đây đã xảy ra:
- Các chức năng
SpeechServiceđã được di chuyển sang ứng dụng Dịch vụ lời nói của Google, ứng dụng này trở thành trình cung cấpSpeechServicemặ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 một trampoline để 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, trampoline này sẽ bị xoá.
Ứng dụng nên sử dụng trình cung cấp mặc định của thiết bị cho SpeechService, thay vì mã hoá cứng một ứng dụng cụ thể.