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, rõ đã chạy ở đầu ứng dụng, trong khi ứng dụng vẫn hiển thị (và do đó chưa bị dừng).
- Hoạt động bị mất tiêu điểm nhưng không bị che khuất và có thể được người dùng tương tác. Cho ví dụ: ở chế độ nhiều cửa sổ, một số hoạt động có thể hiển thị và nhận nhập bằng cách chạm đồng thời.
Những tình huống này khác nhau về mức độ tạm dừng ứng dụng mà ứng dụng phải thực hiện nhưng không thể khác biệt ở cấp ứng dụng.
Trong Android 10, tất cả hoạt động có thể lấy hàng đầu trong các ngăn xếp hiển thị đều nằm trong
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 những ứng dụng 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 trong chế độ chia đôi màn hình đều được tiếp tục.
- Tất cả các hoạt động có thể nhìn thấy trên cùng ở chế độ cửa sổ dạng tự do sẽ được tiếp tục.
- Bạn có thể tiếp tục các hoạt động trên nhiều màn hình cùng một lúc.
Hình 1. Tính năng Tiếp tục nhiều lần trên thiết bị có thể gập lại
Hình 2. Tiếp tục nhiều lần ở chế độ máy tính
Các hoạt động có thể ở trạng thái PAUSED
khi không thể lấy hoặc làm tâm điểm
bị che khuất một phần, chẳng hạn như:
- Trong màn hình chia đôi thu nhỏ (có trình chạy ở bên cạnh), hoạt động trên cùng không tiếp tục vì nó nằm không thể làm tâm điểm.
- Ở chế độ hình trong hình, hoạt động sẽ không tiếp tục vì không thể lấy tiêu điểm.
- Khi các hoạt động thuộc các hoạt động rõ ràng khác trong cùng một ngăn xếp.
Phương pháp này cho các ứng dụng biết rằng một hoạt động 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 được dữ liệu đầu vào ở trạng thái PAUSED
(ví dụ: hãy thử chạm
cả hai hoạt động ở chế độ chia đôi màn hình cùng lúc trên một thiết bị chạy Android 9).
Để duy trì tín hiệu đã tiếp tục từ các bản phát hành Android trước đây (và để thông báo khi nào ứng dụng nên có quyền truy cập độc quyền hoặc singleton tài nguyên), Android 10 có một lệnh gọi lại mới:
Activity#onTopResumedActivityChanged(boolean onTop)
Khi được gọi, lệnh gọi lại này sẽ được gọi trong khoảng thời gian Activity#onResume()
và Activity#onPause()
. Lệnh gọi lại này là không bắt buộc và có thể bỏ qua,
để một hoạt động có thể chuyển từ trạng thái RESUMED
sang trạng thái PAUSED
mà không trở thành vị trí trên cùng trong hệ thống. Ví dụ: ở chế độ nhiều cửa sổ.
Vì lệnh gọi lại này là không bắt buộc nên không thuộc Activity
Lifecycle và nên hiếm khi được sử dụng.
Hoạt động được tiếp tục hàng đầu trước đó nhận được và kết thúc thực thi
onTopResumedActivity(false)
trước 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 tính năng tiếp tục nhiều lần, hãy cân nhắc những cách sau Cloud.
Nhiều hoạt động được tiếp tục trong một quy trình của ứng dụng
- Vấn đề. Trên Android 9 trở xuống, chỉ có một hoạt động trong hệ thống là được tiếp tục cùng một lúc. Tất 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 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ề trạng thái được tiếp tục hoạt động trong singleton.
- Giải pháp. Trong Android 9 trở xuống, nếu hai hoạt động từ cùng một quy trình đều được tiếp tục, hệ thống chỉ tiếp tục hoạt động cao hơn theo thứ tự Z. Ứng dụng nhắm đến Android 10 có thể hỗ trợ nhiều hoạt động được tiếp tục cùng một lúc.
Quyền truy cập đồng thời vào camera
- Vấn đề. Những vấn đề này cũng xuất hiện trong Android 9 và
thấp hơn. Ví dụ: một hoạt động ở chế độ toàn màn hình và đã tiếp tục có thể mất tiêu điểm của máy ảnh vào một
hoạt động bị tạm dừng ở trên cùng ở chế độ hình trong hình nhưng sẽ hiển thị nhiều hơn
trong việc áp dụng rộng rãi các chế độ nhiều cửa sổ và nhiều màn hình.
- Do những thay đổi đối với trạng thái
RESUME
, các ứng dụng có thể đã ngắt kết nối khỏi máy ảnh ngay cả khi đã tiếp tục hoạt động. Để giải quyết vấn đề này, các ứng dụng phải xử lý 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ả các lệnh gọi đến API bắt đầu gửiCameraAccessException
. resizeableActivity=false
không đảm bảo rằng máy ảnh dành riêng cho bạn vì các ứng dụng khác dùng máy ảnh có thể mở trên màn hình khác.
- Do những thay đổi đối với trạng thái
- Giải pháp. Nhà phát triển nên đưa logic về thời điểm ứ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 đó
nên xem lệnh gọi lại khả năng sử dụng máy ảnh để thử kết nối lại và tiếp tục
sử dụng máy ảnh. Ngoài quy tắc hiện có
Gọi lại
CameraManager#AvailabilityCallback#onCameraAvailable()
, Đã thêm Android 10CameraManager#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ố các hoạt động được tiếp tục. Nhà phát triển ứng dụng nên sử dụng cả hai phương thức gọi lại này để hãy xác định thời điểm thích hợp để sử dụng máy ảnh.
Tiếp tục nhiều lần (multi-resume)
Trong Android 10, trạng thái vòng đời hoạt động được xác định theo chế độ hiển thị và
Thứ tự Z. Để đảm bảo rằng trạng thái chính xác sau khi chế độ hiển thị cập nhật trên
hoạt động và đánh giá trạng thái vòng đời nào đang áp dụng, hãy gọi phương thức
Phương thức ActivityRecord#makeActiveIfNeeded()
từ các phương thức khác
vị trí. Trong Android 10, trạng thái đang hoạt động có nghĩa là RESUMED
hoặc
PAUSED
và chỉ hoạt động trong 2 trường hợp này.
Trên Android 10, việc tiếp tục một hoạt động sẽ được theo dõi riêng 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ố
Quá trình chuyển đổi hoạt động có thể được thực hiện đồng thời ở chế độ nhiều cửa sổ. Cho
chi tiết, hãy xem ActivityStack#mInResumeTopActivity
.
Lệnh gọi lại hoạt động được tiếp tục phổ biến nhất
Sau những hành động có thể dẫn đến thay đổi về hoạt động hàng đầu (chẳng hạn như hoạt động
chạy, tiếp tục hoặc thay đổi thứ tự Z),
ActivityStackSupervisor#updateTopResumedActivityIfNeeded()
sẽ được gọi. Chiến dịch này
phương thức 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 thiết. Nếu hoạt động được tiếp tục hàng đầu trước đó không phát hành hoạt động được tiếp tục hàng đầu
trạng thái, sau đó một thông báo mất trạng thái tiếp tục hàng đầu sẽ được gửi đến thông báo đó và thời gian chờ là
được lên lịch ở phía máy chủ
(ActivityStackSupervisor#scheduleTopResumedStateLossTimeout()
).
Báo cáo về trạng thái được tiếp tục hàng đầu sẽ được gửi đến hoạt động tiếp theo sau hoạt động trước đó
một trạng thái được giải phóng hoặc khi hết thời gian chờ (xem cách sử dụng:
ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()
Đã thêm một mặt hàng giao dịch mới của TopResumedActivityChangeItem
để báo cáo các thay đổi về 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 hàng đầu được lưu trữ ở phía máy khách và mỗi khi
chuyển đổi hoạt động sang RESUMED
hoặc PAUSED
.
kiểm tra xem lệnh gọi lại onTopResumedActivityChanged()
có nên
đã gọi. Điều này cho phép việc phân tách nhất định khi giao tiếp các trạng thái vòng đời
và trạng thái đã tiếp tục trên cùng giữa phía máy chủ và phía máy khách.