Çoklu özgeçmiş

Android 9'da (ve daha eski sürümlerde) uygulamalar şu durumlarda PAUSED durumuna girildi:

  • Uygulama hâlâ görünürken (ve bu nedenle durdurulmamışken) uygulamanın üstünde yeni, yarı saydam bir etkinlik başlatıldı.
  • Etkinlik odak noktasını kaybetti ancak engellenmedi ve kullanıcı tarafından etkileşime geçilebiliyordu. Örneğin, çoklu pencere modunda bir dizi etkinlik aynı anda görülebilir ve 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 üst düzeyde odaklanılabilen etkinliklerin tümü RESUMED durumunda bulunur. Bu, kullanıcı arayüzünü yenilemeyi ve kullanıcıyla etkileşimi durdurmayı durdurmak için onStop() onPause() kullanan uygulamalar için Çoklu Pencere ve MD modlarıyla uyumluluğu artırır. Bu şu anlama gelir:

  • Bölünmüş ekrandaki her iki etkinlik de sürdürülür.
  • Serbest biçimli pencereleme modunda üstte görünen tüm etkinlikler sürdürülür.
  • Birden fazla ekrandaki etkinliklere aynı anda devam edilebilir.

Şekil 1. Katlanabilir bir cihazda çoklu özgeçmiş

Şekil 2. Masaüstü modunda çoklu özgeçmiş

Etkinlikler, odaklanamadıklarında veya kısmen tıkandıklarında PAUSED durumda kalabilirler; örneğin:

  • Küçültülmüş bölünmüş ekranda (başlatıcı yandayken), odaklanılamadığı için en üstteki etkinlik sürdürülmez.
  • Resim içinde resim modunda, odaklanılamadığı için etkinlik sürdürülmez.
  • Faaliyetler aynı yığındaki diğer şeffaf faaliyetler tarafından kapsandığında.

Bu yaklaşım, uygulamalara bir etkinliğin yalnızca RESUMED durumunda bir kullanıcıdan girdi alabildiğini gösterir. Android 10'dan önce etkinlikler PAUSED durumda da giriş alabiliyordu (örneğin, Android 9 çalıştıran bir cihazda bölünmüş ekranda her iki etkinliğe aynı anda dokunmayı deneyin).

Önceki Android sürümlerinden devam ettirilen sinyali korumak (ve uygulamaların özel erişime veya tekil kaynaklara ne zaman erişmesi gerektiğini bildirmek için) Android 10 yeni bir geri arama içerir:

Activity#onTopResumedActivityChanged(boolean onTop)

Çağrıldığında, bu geri çağırma Activity#onResume() ve Activity#onPause() arasında çağrılır. Bu geri çağırma isteğe bağlıdır ve atlanabilir; böylece bir etkinlik, sistemdeki en üst düzey olmadan RESUMED durumundan PAUSED durumuna geçebilir. Örneğin çoklu pencere modunda. Bu geri çağırma 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 üst düzeyde sürdürülen etkinlik, önceki etkinliğin yöntem çağrısını işlemek için çok fazla zaman almaması ve 500 ms zaman aşımına uğramaması durumunda, sonraki üst düzeyde sürdürülen etkinlik onTopResumedActivity onTopResumedActivity(false) almadan önce onTopResumedActivity(true) yürütmesini alır ve bitirir.

Uyumluluk

Çoklu özgeçmiş uygularken uyumluluğu korumak için bu çözümleri göz önünde bulundurun.

Tek bir uygulama sürecinde birden çok devam ettirilen aktivite

  • Sorun. Android 9 ve önceki sürümlerde, sistemdeki tek seferde yalnızca bir etkinlik sürdürülür. Faaliyetler arasındaki tüm geçişler, bir faaliyete devam etmeden önce bir faaliyetin duraklatılmasını 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çteki iki etkinliğin her ikisi de sürdürülürse sistem yalnızca Z sırasına göre daha yüksek olan etkinliği sürdürür. Android 10'u hedefleyen uygulamalar, aynı anda birden fazla etkinliğin sürdürülmesini destekleyebilir.

Eş zamanlı kamera erişimi

  • Sorunlar . Bu sorunlar Android 9 ve daha düşük sürümlerde de mevcuttur. Örneğin, tam ekran ve devam ettirilen bir aktivite, resim içinde resim modunda kamera odağını üstteki duraklatılmış bir aktivite nedeniyle kaybedebilir, ancak çoklu pencere ve çoklu ekran modlarının daha geniş çapta benimsenmesiyle daha fazla açığa çıkarılabilir.
    • RESUME ET durumunda yapılan değişiklikler nedeniyle, devam ettirilirken bile uygulamaların kamerayla bağlantısı kesilebilir. Bu sorunu çözmek için uygulamaların kamera bağlantısını kesme işlemini çökmeden gerçekleştirmesi gerekir. Bağlantı kesildiğinde uygulamalar bağlantısı kesilen bir geri arama alır ve API'ye yapılan tüm çağrılar CameraAccessException oluşturmaya 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 kullanılacak mantığı içermelidir. Bir uygulamanın kamerayla bağlantısı kesilirse, yeniden bağlanmayı ve kamerayı kullanmaya devam etmeyi denemek için kamera kullanılabilirliği geri aramalarını izlemesi gerekir. Mevcut CameraManager#AvailabilityCallback#onCameraAvailable() geri çağrısına ek olarak, Android 10, odağın (ve kamera önceliğinin) sürdürülen 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 amacıyla 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ına göre 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 aktif, RESUMED veya PAUSED anlamına gelir ve yalnızca bu iki durumda çalışır.

Android 10'da bir etkinliğin sürdürülmesi, sistemdeki tek konum yerine her yığında ayrı ayrı izlenir. Bunun nedeni, çoklu pencere modlarında birden fazla etkinlik geçişinin aynı anda gerçekleştirilebilmesidir. Ayrıntılar için bkz. ActivityStack#mInResumeTopActivity .

En çok sürdürülen etkinlik geri araması

Üst aktivite değişikliğiyle sonuçlanabilecek 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 sürdürülen etkinliğin değişip değişmediğini kontrol eder ve gerekirse güncellemeyi gerçekleştirir. Önceki en üst düzeyde sürdürülen etkinlik, en üst düzeyde sürdürülen durumu serbest bırakmadıysa, ona bir üst sürdürülen durum kaybı mesajı gönderilir ve sunucu tarafında bir zaman aşımı planlanır ( ActivityStackSupervisor#scheduleTopResumedStateLossTimeout() ). En üst düzeyde sürdürülen durumun bir raporu, bir önceki aktivitenin durumu serbest bırakmasından sonra veya bir zaman aşımına uğradığında bir sonraki aktiviteye gönderilir (bkz. kullanımları:

ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()

İstemcilere en çok sürdürülen durum değişikliklerini raporlamak için yeni bir TopResumedActivityChangeItem işlem öğesi eklendi ve Android 9'daki ActivityLifecycler mimarisinden yararlanıyor.

En üst düzeyde sürdürülen durum istemci tarafında depolanır ve etkinlik RESUMED veya PAUSED durumuna her geçişinde onTopResumedActivityChanged() geri çağrısının çağrılması gerekip gerekmediğini de kontrol eder. Bu, yaşam döngüsü durumlarının ve sunucu ile istemci tarafları arasında en üst düzeyde sürdürülen durumun iletişiminde belirli bir ayrıştırmaya olanak tanır.