Tiếp tục nhiều lần (multi-resume)

Trong Android 9 (trở xuống), các ứng dụng được chuyển sang trạng thái PAUSED khi:

  • Một hoạt động mới, mờ được khởi chạy phía trên ứng dụng, trong khi ứng dụng vẫn hiển thị (và do đó, không bị dừng).
  • Hoạt động bị mất tiêu điểm nhưng không bị che khuất và người dùng có thể tương tác. Ví dụ: ở chế độ nhiều cửa sổ, một số hoạt động có thể hiển thị và nhận đầu vào bằng cảm ứng cùng một lúc.

Những tình huống này khác nhau ở mức độ tạm dừng mà ứng dụng phải thực hiện nhưng không thể phân biệt được ở cấp ứng dụng.

Trong Android 10, tất cả các hoạt động có thể tập trung hàng đầu trong ngăn xếp hiển thị đều ở trạng thái RESUMED . Điều này cải thiện khả năng tương thích với chế độ Nhiều cửa sổ và MD cho các ứng dụng sử dụng onPause() thay vì onStop() để ngừng làm mới giao diện người dùng và tương tác với người dùng. Điều này có nghĩa là:

  • Cả hai hoạt động ở chế độ chia đôi màn hình đều được tiếp tục.
  • Tất cả các hoạt động hiển thị trên cùng ở chế độ cửa sổ dạng tự do sẽ được tiếp tục.
  • Các hoạt động trên nhiều màn hình có thể được tiếp tục cùng một lúc.

Hình 1. Nhiều sơ yếu lý lịch trên thiết bị có thể gập lại

Hình 2. Multi-sơ yếu lý lịch trong chế độ máy tính để bàn

Các hoạt động có thể nằm ở trạng thái PAUSED khi chúng không thể được tập trung vào hoặc bị che khuất một phần, chẳng hạn như:

  • Trong màn hình chia nhỏ được thu nhỏ (có trình khởi chạy ở bên cạnh), hoạt động hàng đầu không được tiếp tục vì không thể lấy tiêu điểm.
  • Ở chế độ ảnh trong ảnh, hoạt động không được tiếp tục vì không thể lấy tiêu điểm.
  • Khi các hoạt động được bao phủ bởi các hoạt động minh bạch khác trong cùng một ngăn xếp.

Cách tiếp cận này cho ứng dụng biết rằng một hoạt động chỉ có thể nhận dữ liệu đầu vào từ người dùng ở trạng thái RESUMED . Trước Android 10, các hoạt động cũng có thể nhận dữ liệu đầu vào ở trạng thái PAUSED (ví dụ: thử chạm đồng thời cả hai hoạt động ở chế độ chia đôi màn hình trên thiết bị chạy Android 9).

Để duy trì tín hiệu được tiếp tục từ các bản phát hành Android trước đó (và để thông báo khi nào ứng dụng sẽ có quyền truy cập vào các tài nguyên có quyền truy cập độc quyền hoặc tài nguyên đơn lẻ), Android 10 bao gồm một lệnh gọi lại mới:

Activity#onTopResumedActivityChanged(boolean onTop)

Khi được gọi, cuộc gọi lại này được gọi giữa Activity#onResume()Activity#onPause() . Cuộc gọi lại này là tùy chọn và có thể được bỏ qua, do đó, một hoạt động có thể chuyển từ trạng RESUMED sang trạng thái PAUSED mà không trở thành hoạt động cao nhất trong hệ thống. Ví dụ: ở chế độ nhiều cửa sổ. Vì lệnh gọi lại này là tùy chọn nên nó không phải là một phần của Vòng đời hoạt động và hiếm khi được sử dụng.

Hoạt động được tiếp tục hàng đầu trước đó nhận và kết thúc việc thực thi onTopResumedActivity(false) trước khi hoạt động được tiếp tục hàng đầu tiếp theo nhận được onTopResumedActivity(true) trừ khi hoạt động trước đó mất quá nhiều thời gian để xử lý lệnh gọi phương thức và đạt đến thời gian chờ 500 mili giây.

Khả năng tương thích

Để duy trì khả năng tương thích khi triển khai nhiều sơ yếu lý lịch, hãy xem xét các giải pháp này.

Nhiều hoạt động được tiếp tục lại trong một quy trình ứng dụng

  • Vấn đề. Trong Android 9 trở xuống, mỗi lần chỉ có một hoạt động trong hệ thống được tiếp tục. Tất cả các quá trình chuyển đổi giữa các hoạt động đều liên quan đến việc tạm dừng một hoạt động trước khi tiếp tục một hoạt động khác. Một số ứng dụng và khung (chẳng hạn như Flutter hoặc LocalActivityManager của Android) sử dụng thực tế này và lưu trữ trạng thái về hoạt động được tiếp tục trong các đơn vị.
  • Giải pháp. Trong Android 9 trở xuống, nếu cả hai hoạt động từ cùng một quy trình đều được tiếp tục thì hệ thống chỉ tiếp tục hoạt động cao hơn theo thứ tự Z. Các ứng dụng nhắm mục tiêu Android 10 có thể hỗ trợ nhiều hoạt động được tiếp tục cùng một lúc.

Truy cập camera đồng thời

  • Vấn đề . Những vấn đề này cũng xuất hiện trong Android 9 trở xuống. Ví dụ: hoạt động toàn màn hình và hoạt động được tiếp tục lại có thể làm mất tiêu điểm của máy ảnh do hoạt động bị tạm dừng ở trên cùng ở chế độ hình trong ảnh nhưng trở nên lộ rõ ​​hơn khi sử dụng rộng rãi hơn chế độ nhiều cửa sổ và nhiều màn hình.
    • Do những thay đổi được thực hiện đối với trạng thái RESUME , các ứng dụng có thể bị ngắt kết nối khỏi máy ảnh ngay cả khi đang được tiếp tục lại . Để giải quyết vấn đề này, các ứng dụng phải xử lý việc ngắt kết nối camera mà không gặp sự cố. Khi bị ngắt kết nối, các ứng dụng sẽ nhận được lệnh gọi lại bị ngắt kết nối và tất cả lệnh gọi vào API bắt đầu gửi CameraAccessException .
    • resizeableActivity=false không đảm bảo quyền truy cập máy ảnh độc quyền vì các ứng dụng khác sử dụng máy ảnh có thể được mở trên các màn hình khác.
  • Các giải pháp. Nhà phát triển nên bao gồm logic khi ứng dụng bị ngắt kết nối khỏi máy ảnh. Nếu một ứng dụng bị ngắt kết nối khỏi máy ảnh, ứng dụng đó sẽ xem các lệnh gọi lại về tình trạng sẵn sàng của máy ảnh để cố gắng kết nối lại và tiếp tục sử dụng máy ảnh. Ngoài lệnh gọi lại CameraManager#AvailabilityCallback#onCameraAvailable() hiện có, Android 10 đã thêm CameraManager#AvailabilityCallback#onCameraAccessPrioritiesChanged() , bao gồm trường hợp khi tiêu điểm (và mức độ ưu tiên của máy ảnh) chuyển đổi giữa một số hoạt động được tiếp tục. Các nhà phát triển ứng dụng nên sử dụng cả hai lệnh gọi lại này để xác định thời điểm phù hợp để cố gắng truy cập vào máy ảnh.

Nhiều sơ yếu lý lịch

Trong Android 10, trạng thái vòng đời hoạt động được xác định bởi mức độ hiển thị và thứ tự Z. Để đảm bảo rằng trạng thái chính xác sau khi hiển thị cập nhật trên một hoạt động và đánh giá trạng thái vòng đời nào có thể áp dụng, hãy gọi phương thức ActivityRecord#makeActiveIfNeeded() từ các vị trí khác nhau. Trong Android 10, hoạt động có nghĩa là RESUMED hoặc PAUSED và chỉ hoạt động trong hai trường hợp này.

Trong Android 10, việc tiếp tục một hoạt động được theo dõi riêng biệt trong từng ngăn xếp thay vì ở một vị trí duy nhất trong hệ thống. Điều này là do một số chuyển đổi hoạt động có thể được thực hiện đồng thời trong chế độ nhiều cửa sổ. Để biết chi tiết, hãy xem ActivityStack#mInResumeTopActivity .

Lệnh gọi lại hoạt động được tiếp tục hàng đầu

Sau các hành động có thể dẫn đến thay đổi hoạt động hàng đầu (chẳng hạn như khởi chạy, tiếp tục hoạt động hoặc thay đổi thứ tự Z), ActivityStackSupervisor#updateTopResumedActivityIfNeeded() sẽ được gọi. Phương pháp này kiểm tra xem hoạt động được tiếp tục trên cùng có thay đổi hay không và thực hiện cập nhật nếu cần. Nếu hoạt động được tiếp tục lại nhiều nhất trước đó không giải phóng trạng thái được tiếp tục lại nhiều nhất thì một thông báo mất trạng thái được tiếp tục lại nhiều nhất sẽ được gửi tới hoạt động đó và thời gian chờ được lên lịch ở phía máy chủ ( ActivityStackSupervisor#scheduleTopResumedStateLossTimeout() ). Một báo cáo về trạng thái được tiếp tục lại nhiều nhất sẽ được gửi đến hoạt động tiếp theo sau khi hoạt động trước đó giải phóng trạng thái hoặc khi đạt đến thời gian chờ (xem cách sử dụng:

ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()

Một mục giao dịch TopResumedActivityChangeItem mới đã được thêm vào để báo cáo các thay đổi trạng thái được tiếp tục hàng đầu cho khách hàng và tận dụng kiến ​​trúc ActivityLifecycler từ Android 9.

Trạng thái tiếp tục trên cùng được lưu trữ ở phía máy khách và mỗi khi hoạt động chuyển sang RESUMED hoặc PAUSED , nó cũng kiểm tra xem có nên gọi lại lệnh gọi lại onTopResumedActivityChanged() hay không. Điều này cho phép tách rời nhất định trong quá trình liên lạc giữa các trạng thái vòng đời và trạng thái được tiếp tục lại hàng đầu giữa phía máy chủ và máy khách.