Hạn chế khi bắt đầu hoạt động ở chế độ nền

Android 10 (API cấp 29) trở lên có quy định hạn chế về thời điểm khởi động ứng dụng hoạt động khi ứng dụng chạy trong nền. Những hạn chế này giúp giảm thiểu tình trạng gián đoạn cho người dùng và giúp người dùng kiểm soát tốt hơn nội dung hiển thị trên màn hình.

Hướng dẫn này giới thiệu thông báo như một giải pháp thay thế cho việc bắt đầu hoạt động từ nền. Phần này cũng liệt kê các trường hợp cụ thể mà quy định hạn chế này không sẽ áp dụng.

Hiện thông báo

Trong hầu hết mọi trường hợp, các ứng dụng chạy ở chế độ nền phải hiển thị thông báo có giới hạn thời gian để cung cấp thông tin khẩn cấp cho người dùng thay vì trực tiếp bắt đầu một hoạt động. Các thông báo như vậy bao gồm xử lý cuộc gọi điện thoại đến hoặc báo thức đang hoạt động đồng hồ.

Hệ thống cảnh báo và nhắc nhở dựa trên thông báo này cung cấp một số lợi thế đối với người dùng:

  • Khi sử dụng thiết bị, người dùng sẽ thấy một thông báo quan trọng cho phép họ phản hồi. Người dùng duy trì ngữ cảnh hiện tại của họ và có quyền kiểm soát mà họ nhìn thấy trên màn hình.
  • Các thông báo có giới hạn thời gian tôn trọng quyền của người dùng Quy tắc Không làm phiền. Để ví dụ: người dùng có thể chỉ cho phép cuộc gọi từ những người liên hệ cụ thể hoặc từ những người liên hệ nhiều lần người gọi khi chế độ Không làm phiền đang bật.
  • Khi màn hình thiết bị tắt, ý định toàn màn hình sẽ khởi chạy ngay lập tức.
  • Trong màn hình Cài đặt của thiết bị, người dùng có thể xem ứng dụng nào có thông báo gửi gần đây, kể cả thông báo từ các kênh thông báo cụ thể. Trên màn hình này, người dùng có thể kiểm soát lựa chọn ưu tiên về thông báo.

Thời điểm ứng dụng có thể bắt đầu hoạt động

Các ứng dụng chạy trên Android 10 trở lên có thể bắt đầu hoạt động khi một hoặc nhiều điều kiện sau được đáp ứng:

  • Ứng dụng có một cửa sổ hiển thị, chẳng hạn như một hoạt động ở nền trước.
  • Ứng dụng này có một hoạt động trong ngăn xếp lui của tác vụ trên nền trước.
  • Ứng dụng này có một hoạt động trong ngăn xếp lui của một nhiệm vụ hiện có trên Màn hình Gần đây.

  • Ứng dụng có một hoạt động mới bắt đầu gần đây.

  • Ứng dụng có tên finish() trên một hoạt động gần đây. Điều này chỉ áp dụng khi ứng dụng có hoạt động ở nền trước hoặc một hoạt động trong ngăn xếp lui của tác vụ trên nền trước tại thời điểm gọi finish().

  • Ứng dụng có một trong các dịch vụ sau đây và chịu sự ràng buộc của hệ thống. Các có thể cần khởi chạy giao diện người dùng.

  • Ứng dụng có một dịch vụ bị ràng buộc bởi một ứng dụng hiển thị khác. Ứng dụng liên kết với dịch vụ phải tiếp tục hiển thị với ứng dụng ở chế độ nền bắt đầu hoạt động thành công.

  • Ứng dụng nhận được một thông báo PendingIntent khỏi hệ thống. Ngang bằng trường hợp ý định đang chờ xử lý cho các dịch vụ và broadcast receiver, ứng dụng có thể bắt đầu hoạt động trong vài giây sau khi ý định đang chờ xử lý được gửi.

  • Ứng dụng nhận được một PendingIntent gửi từ một chế độ hiển thị khác .

  • Ứng dụng nhận được thông báo của hệ thống, trong đó ứng dụng dự kiến sẽ khởi chạy một Giao diện người dùng. Ví dụ như ACTION_NEW_OUTGOING_CALLSECRET_CODE_ACTION. Ứng dụng có thể bắt đầu các hoạt động trong vài giây sau khi thông báo được gửi đi.

  • Ứng dụng được liên kết với một thiết bị phần cứng đi kèm thông qua CompanionDeviceManager API. API này cho phép ứng dụng bắt đầu các hoạt động để phản hồi các hành động mà mà người dùng thực hiện trên một thiết bị được ghép nối.

  • Ứng dụng là trình kiểm soát chính sách thiết bị chạy trong chế độ chủ sở hữu thiết bị. Ví dụ về trường hợp sử dụng: thiết bị được quản lý hoàn toàn dành cho doanh nghiệp cũng như thiết bị chuyên dụng như kỹ thuật số biển hiệu và quầy hàng.

  • Ứng dụng được người dùng cấp quyền SYSTEM_ALERT_WINDOW.

Bắt buộc phải chọn sử dụng khi bắt đầu hoạt động từ PendingIntent

Để tránh cho phép Hoạt động vô tình bắt đầu dựa trên danh sách điều kiện, bắt đầu từ Android 14, có các API rõ ràng cho phép bạn để chọn cho phép hoặc không cấp quyền cho ứng dụng khi bắt đầu Hoạt động.

Theo mặc định, ứng dụng nhắm đến Android 15 trở lên sẽ không được thiết lập một cách ngầm ẩn nữa cấp đặc quyền khởi chạy hoạt động ở chế độ nền (BAL) cho PendingIntents mà họ tạo. Bạn phải chọn hiển thị công khai rõ ràng. Để làm như vậy, đây là những lựa chọn tuỳ thuộc vào việc ứng dụng đang gửi hay tạo PendingIntents.

Bảng ý định đang chờ xử lý
Hình 1: Quy trình quyết định đối với các lần chạy hoạt động ở chế độ nền.

Bởi người gửi của PendingIntent

Ứng dụng nhắm đến Android 14 trở lên muốn bắt đầu PendingIntent phải

Lựa chọn tham gia này chỉ xảy ra nếu nhà phát triển ứng dụng biết rằng ứng dụng sẽ bắt đầu một Hoạt động.

Để chọn sử dụng, ứng dụng phải truyền gói ActivityOptionssetPendingIntentBackgroundActivityStartMode(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) với PendingIntent.send() hoặc các phương thức tương tự.

Bởi người tạo ra PendingIntent

Giờ đây, những ứng dụng nhắm đến Android 15 trở lên và có thể tạo PendingIntent một cách rõ ràng chọn cho phép khởi chạy hoạt động ở chế độ nền nếu họ muốn PendingIntents có thể khởi động theo các điều kiện đã nêu.

Trong hầu hết các trường hợp, ứng dụng bắt đầu PendingIntent phải là ứng dụng chọn sử dụng. Tuy nhiên, nếu ứng dụng đang tạo cần cấp các đặc quyền này:

  • Bạn có thể bắt đầu PendingIntent bất cứ lúc nào ứng dụng tạo xuất hiện.
  • Bạn có thể bắt đầu PendingIntent bất cứ lúc nào nếu ứng dụng tạo có đặc điểm đặc biệt đặc quyền.

Để chọn sử dụng, ứng dụng phải truyền gói ActivityOptionssetPendingIntentCreatorBackgroundActivityStartMode (ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) vào PendingIntent.getActivity() hoặc các phương thức tương tự.

Hãy đọc tài liệu tham khảo có liên quan để biết thêm chi tiết: