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

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

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

Thay vào đó, hãy hiển thị thông báo

Trong hầu hết các 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 về 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 việc xử lý cuộc gọi điện thoại đến hoặc đồng hồ báo thức đang hoạt động.

Hệ thống cảnh báo và nhắc nhở dựa trên thông báo này mang lại một số lợi ích cho 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 và có quyền kiểm soát nội dung mà họ nhìn thấy trên màn hình.
  • Thông báo có giới hạn thời gian tuân thủ quy tắc Không làm phiền của người dùng. Ví dụ: người dùng có thể chỉ cho phép cuộc gọi của một số người liên hệ cụ thể hoặc của những người gọi lại khi chế độ Không làm phiền đang bật.
  • Khi màn hình của thiết bị tắt, ý định toàn màn hình sẽ khởi chạy ngay lập tức.
  • Trên màn hình Cài đặt của thiết bị, người dùng có thể xem những ứng dụng nào đã gửi thông báo gần đây, bao gồm cả 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 đáp ứng một hoặc nhiều điều kiện sau:

  • Ứ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 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 có một hoạt động trong ngăn xếp lui của một tác vụ hiện có trên màn hình Gần đây.

  • Ứng dụng có một hoạt động 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ó một 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ụ ở nền trước tại thời điểm finish() được gọi.

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

  • Ứng dụng có một dịch vụ được liên kết vớ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 luôn hiển thị để ứng dụng ở chế độ nền có thể bắt đầu các hoạt động thành công.

  • Ứng dụng nhận được thông báo PendingIntent từ hệ thống. Trong 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 các hoạt động trong vài giây sau khi ý định đang chờ xử lý được gửi.

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

  • Ứng dụng sẽ nhận được thông báo truyền tin của hệ thống, trong đó ứng dụng dự kiến sẽ khởi chạy giao diện người dùng. Ví dụ: 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 truyền tin được gửi.

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

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

  • Người dùng cấp cho ứng dụng quyền SYSTEM_ALERT_WINDOW.

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

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

Theo mặc định, các ứng dụng nhắm đến Android 15 trở lên sẽ không còn ngầm cấp đặc quyền khởi chạy hoạt động ở chế độ nền (BAL) cho PendingIntents mà chúng tạo ra. Bạn phải chọn sử dụng một cách rõ ràng. Để làm như vậy, bạn có thể chọn một trong các tuỳ chọn sau, 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 ra quyết định để khởi chạy hoạt động ở chế độ nền.

Do Trình gửi PendingIntent

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

Việc chọn sử dụng này chỉ xảy ra nếu nhà phát triển ứng dụng biết rằng ứng dụng sẽ khởi động 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) đến PendingIntent.send() hoặc các phương thức tương tự.

Do Trình tạo PendingIntent

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

Trong hầu hết các trường hợp, ứng dụng khởi động PendingIntent sẽ là ứng dụng chọn sử dụng. Tuy nhiên, nếu ứng dụng 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 đang 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ác đặc quyền đặc biệt.

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

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