Çoklu Özgeçmiş

Android 9'da (ve daha düşük 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ı.
  • Etkinlik odağını kaybetti, ancak belirsizdi ve kullanıcı tarafından etkileşime girilebilirdi. Örneğin, çoklu pencere modunda, bir dizi etkinlik görünür olabilir 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.
  • Aynı anda birden fazla ekranda etkinliklere devam edilebilir.

Ş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şime veya tekil 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 üst düzeyde sürdürülen etkinlik, bir sonraki üst düzeyde sürdürülen etkinlik onTopResumedActivity(true) ) almadan önce onTopResumedActivity(false) yürütme işlemini alır ve bitirir, eğer önceki etkinliğin yöntem çağrısını işlemesi ç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 çökmeden bir kamera bağlantısını kesmesi gerekir. Bağlantı kesildiğinde, uygulamalar bağlantısı kesilmiş bir geri arama alır ve API'ye yapılan tüm çağrılar CameraAccessException başlar.
    • resizeableActivity=false , özel kamera erişimi garantisi değildir, çünkü kamerayı kullanan diğer uygulamalar başka ekranlarda açılabilir.
  • Çö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 kapsayan CameraManager#AvailabilityCallback#onCameraAccessPrioritiesChanged() ekledi. Uygulama geliştiricileri, kameraya erişmeye çalışmak için iyi bir zaman belirlemek üzere 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.