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

Android 10 (API cấp 29) trở lên giới hạn vị trí cao hơn 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 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 của họ.

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 ở chế độ nền. Tệp 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 được áp dụng.

Hiện thông báo

Trong hầu hết trường hợp, ứng dụng ở chế độ nền phải hiện 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 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 thế 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 sẽ duy trì ngữ cảnh hiện tại và có quyền kiểm soát nội dung mà họ thấy trên màn hình.
  • Các thông báo có giới hạn thời gian tuân theo các 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 nhiều lần khi chế độ Không làm phiền đang bật.
  • Khi màn hình của thiết bị đang 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 ứng dụng nào đã gửi thông báo gần đây, bao gồm cả 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 các 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 đây:

  • Ứ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 mới bắt đầu gần đây.

  • Ứng dụng có tên là finish() trên một hoạt động cách đây không lâu. Đ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ụ trên nền trước tại thời điểm finish() được gọi.

  • Ứng dụng này 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ụ bị ràng buộc bởi một ứng dụng đang hiển thị khác. Ứng dụng liên kết với dịch vụ phải luôn hiển thị cho ứng dụng ở chế độ nền để bắt đầu hoạt động thành công.

  • Ứng dụng sẽ nhận được thông báo PendingIntent từ hệ thống. Trong trường hợp ý định đang chờ xử lý đối với 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 hiển thị khác.

  • Ứng dụng nhận được một thông báo 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ụ 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 đồ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 hành động mà người dùng thực hiện trên một thiết bị đã ghép nối.

  • Ứng dụng là 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ề trường hợp sử dụng bao gồm thiết bị doanh nghiệp được quản lý hoàn toàn cũng như thiết bị chuyên dụng như bảng hiệu kỹ thuật số và kiosk.

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

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

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

Hãy xem:

  • ActivityOptions.setPendingIntentBackgroundActivityStartMode
  • ActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode

Bởi Người gửi PendingIntent

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

Lựa 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ẽ 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) đến PendingIntent.send(...) hoặc các phương thức tương tự.

Của nhà sáng tạo PendingIntent

Những ứng dụng nhắm đến Android 15 trở lên mà tạo PendingIntent phải

Trong hầu hết các trường hợp, ứng dụng khởi động PendingIntent phải là ứng dụng chọn sử dụng.

Khi ứng dụng tạo lựa chọn sử dụng PendingIntent, những điều sau đây sẽ xảy ra:

  • PendingIntent có thể bắt đầu bất cứ khi nào ứng dụng tạo hiển thị
  • có thể khởi động PendingIntent bất cứ lúc nào nếu ứng dụng tạo có đặc quyền đặc biệt

Do đó, bạn không nên truyền PendingIntent như vậy đến một ứng dụng không đáng tin cậy và huỷ PendingIntent khi không còn dùng đến.

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