Android 9'da (ve önceki sürümlerde), uygulamalar şu durumlarda PAUSED
durumuna girildi:
- Uygulama hâlâ görünür durumdayken (ve bu nedenle durdurulmamışken) uygulamanın üstünde yeni, yarı saydam bir etkinlik başlatıldı.
- Aktivite odağı kaybetti, ancak belirsizdi ve kullanıcı tarafından etkileşime girilebilirdi. Örneğin, çoklu pencere modunda, bir dizi etkinlik görülebilir ve aynı anda dokunmatik girdi alabilir.
Bu durumlar, bir uygulamanın yapması gereken duraklatma miktarına göre farklılık gösterir ancak uygulama düzeyinde ayırt edilemez.
Android 10'da, görünür yığınlardaki en iyi odaklanılabilen tüm etkinlikler RESUMED
durumunda bulunur. Bu, kullanıcı arayüzünü yenilemeyi ve kullanıcıyla etkileşimi durdurmak için onPause()
yerine onStop()
() kullanan uygulamalar için Çoklu Pencere ve MD modlarıyla uyumluluğu iyileştirir. Bu şu anlama gelir:
- Bölünmüş ekranda her iki aktivite de devam ettirilir.
- Serbest biçimli pencereleme modunda en üstte görünen tüm etkinlikler sürdürülür.
- Birden fazla ekrandaki etkinlikler aynı anda devam ettirilebilir.
Şekil 1. Katlanabilir bir cihazda çoklu özgeçmiş
Şekil 2. Masaüstü modunda çoklu özgeçmiş
Faaliyetler, odaklanamadıklarında veya kısmen kapatıldıklarında PAUSED
durumda kalabilirler, örneğin:
- Küçültülmüş bir bölünmüş ekranda (başlatıcı yandayken), odaklanılabilir olmadığı için en üstteki etkinlik devam ettirilmez.
- Resim içinde resim modunda, odaklanılabilir olmadığı için etkinlik devam ettirilmez.
- Etkinlikler aynı yığındaki diğer şeffaf etkinlikler tarafından kapsandığında.
Bu yaklaşım, bir etkinliğin yalnızca RESUMED
durumundaki bir kullanıcıdan girdi alabileceğini uygulamalara gösterir. Android 10'dan önce, etkinlikler PAUSED
durumunda girdi de alabilirdi (örneğin, Android 9 çalıştıran bir cihazda her iki etkinliğe aynı anda bölünmüş ekranda dokunmayı deneyin).
Önceki Android sürümlerinden devam ettirilen sinyali korumak (ve uygulamaların özel erişim veya tekli kaynaklara ne zaman erişim elde etmesi gerektiğini bildirmek için), Android 10 yeni bir geri arama içerir:
Activity#onTopResumedActivityChanged(boolean onTop)
Çağrıldığında, bu geri arama Activity#onResume()
ve Activity#onPause()
arasında çağrılır. Bu geri arama isteğe bağlıdır ve atlanabilir, böylece bir aktivite sistemde en üstte olmadan RESUMED
durumundan PAUSED
durumuna geçebilir. Örneğin, çoklu pencere modunda. Bu geri arama isteğe bağlı olduğundan, Etkinlik Yaşam Döngüsünün bir parçası değildir ve nadiren kullanılmalıdır.
Önceki en çok devam ettirilen aktivite, bir sonraki en iyi devam onTopResumedActivity(true)
) almadan önce onTopResumedActivity(false)
'nin yürütülmesini alır ve bitirir, eğer önceki aktivite yöntem çağrısını işlemek için çok fazla zaman almazsa ve 500 ms zaman aşımına ulaşırsa.
uyumluluk
Çoklu özgeçmiş uygularken uyumluluğu korumak için bu çözümleri göz önünde bulundurun.
Bir uygulama sürecinde birden fazla devam ettirilen etkinlik
- Sorun. Android 9 ve önceki sürümlerde, bir seferde sistemdeki yalnızca bir etkinlik sürdürülür. Aktiviteler arasındaki tüm geçişler, başka bir aktiviteye devam etmeden önce bir aktiviteyi duraklatmayı içerir. Bazı uygulamalar ve çerçeveler (Flutter veya Android'in LocalActivityManager'ı gibi) bu gerçeği kullanır ve devam ettirilen etkinlikle ilgili durumu tekil olarak saklar.
- Çözüm. Android 9 ve önceki sürümlerde, aynı süreçten iki etkinliğin her ikisi de sürdürülürse, sistem yalnızca Z-sırasında daha yüksek olan etkinliği sürdürür. Android 10'u hedefleyen uygulamalar, aynı anda devam ettirilen birden fazla etkinliği destekleyebilir.
Eşzamanlı kamera erişimi
- Sorunlar . Bu sorunlar, Android 9 ve önceki sürümlerde de mevcuttur. Örneğin, tam ekran ve devam ettirilen bir etkinlik, resim içinde resim modunda üstte duraklatılmış bir etkinliğe kamera odağını kaybedebilir, ancak çoklu pencere ve çoklu ekran modlarının daha geniş bir şekilde benimsenmesiyle daha açık hale gelebilir.
-
RESUME
durumunda yapılan değişiklikler nedeniyle, uygulamalar devam ettirilirken bile kamerayla bağlantısı kesilebilir. Bunu ele almak için, uygulamaların bir kamera bağlantısının kesilmesini çökmeden işlemesi gerekir. Bağlantı kesildiğinde, uygulamalar bağlantısı kesilmiş bir geri arama alır ve API'ye yapılan tüm çağrılarCameraAccessException
başlar. -
resizeableActivity=false
, kamerayı kullanan diğer uygulamalar başka ekranlarda açılabileceğinden, özel kamera erişimi garantisi değildir.
-
- Çözümler. Geliştiriciler, bir uygulamanın kamerayla bağlantısı kesildiğinde mantığı içermelidir. Bir uygulamanın kamerayla bağlantısı kesilirse, yeniden bağlanmayı ve kamera kullanımına devam etmeyi denemek için kamera kullanılabilirliği geri aramalarını izlemelidir. Mevcut
CameraManager#AvailabilityCallback#onCameraAvailable()
geri çağrısına ek olarak, Android 10, odağın (ve kamera önceliğinin) devam ettirilen birkaç etkinlik arasında geçiş yaptığı durumu kapsayanCameraManager#AvailabilityCallback#onCameraAccessPrioritiesChanged()
ekledi. Uygulama geliştiricileri, kameraya erişmeye çalışmak için iyi bir zaman belirlemek için bu geri aramaların her ikisini de kullanmalıdır.
Çoklu özgeçmiş
Android 10'da etkinlik yaşam döngüsü durumu, görünürlük ve Z-sırasıyla belirlenir. Bir etkinlikte görünürlük güncellemelerinden sonra doğru durumun olduğundan emin olmak ve hangi yaşam döngüsü durumunun uygulanabilir olduğunu değerlendirmek için, farklı konumlardan ActivityRecord#makeActiveIfNeeded()
yöntemini çağırın. Android 10'da etkin, RESUMED
veya PAUSED
anlamına gelir ve yalnızca bu iki durumda çalışır.
Android 10'da, bir etkinliğin devam ettirilmesi, sistemdeki tek konum yerine her yığında ayrı ayrı izlenir. Bunun nedeni, çok pencereli modlarda aynı anda birkaç etkinlik geçişinin gerçekleştirilebilmesidir. Ayrıntılar için, bkz. ActivityStack#mInResumeTopActivity
.
En çok devam ettirilen etkinlik geri araması
Bir üst etkinlik değişikliğine neden olabilecek eylemlerden sonra (etkinlik başlatma, devam ettirme veya Z sırası değişikliği gibi), ActivityStackSupervisor#updateTopResumedActivityIfNeeded()
çağrılır. Bu yöntem, en üstte devam ettirilen etkinliğin değişip değişmediğini kontrol eder ve gerekirse güncellemeyi gerçekleştirir. Önceki en çok devam ettirilen aktivite, en çok devam ettirilen durumu serbest bırakmadıysa, o zaman ona bir en çok devam ettirilen durum kaybı mesajı gönderilir ve sunucu tarafında bir zaman aşımı planlanır ( ActivityStackSupervisor#scheduleTopResumedStateLossTimeout()
). En çok devam ettirilen duruma ilişkin bir rapor, bir önceki aktivite durumu yayınladıktan sonra veya bir zaman aşımına uğradığında bir sonraki etkinliğe gönderilir (bkz. kullanımları:
ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()
En çok devam ettirilen durum değişikliklerini istemcilere bildirmek için yeni bir TopResumedActivityChangeItem
işlem öğesi eklendi ve Android 9'daki ActivityLifecycler
mimarisinden yararlanıyor.
En üstte sürdürülen durum istemci tarafında depolanır ve aktivite RESUMED
veya PAUSED
durumuna her geçişinde ayrıca onTopResumedActivityChanged()
geri çağrısının çağrılması gerekip gerekmediğini kontrol eder. Bu, yaşam döngüsü durumlarının iletişiminde ve sunucu ile istemci tarafları arasındaki en üstte devam ettirilen durumun belirli bir şekilde ayrılmasını sağlar.