Çoklu devam ettirme

Android 9 ve önceki sürümlerde uygulamalar şu durumlarda PAUSED durumuna giriyordu:

  • Uygulama hâlâ görünürken (ve bu nedenle durdurulmamışken) uygulamanın üzerinde yeni, yarı saydam bir etkinlik başlatıldı.
  • Etkinlik odağını kaybetti ancak görünür durumdaydı ve kullanıcı tarafından etkileşimde bulunulabiliyordu. Örneğin, çoklu pencere modunda, bir dizi etkinlik aynı anda görünür ve dokunma girişi alabilir.

Bu durumlar, bir uygulamanın duraklatması gereken süre açısından farklılık gösterir ancak uygulama düzeyinde ayırt edilemez.

Android 10'da, görünür yığınlardaki tüm odaklanılabilir etkinlikler RESUMED durumundadır. Bu, kullanıcı arayüzünün yenilenmesini durdurmak ve kullanıcıyla etkileşim kurmak için onStop() yerine onPause() kullanan uygulamalarda Çoklu Pencere ve MD modlarıyla uyumluluğu artırır. Bunun anlamı şudur:

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

1. şekil. Katlanabilir cihazlarda çoklu devam ettirme

Şekil 2. Masaüstü modunda birden fazla özgeçmiş yükleme

Etkinlikler, odaklanılamadığında veya kısmen kapatıldığında PAUSED durumunda olabilir. Örneğin:

  • Küçültülmüş bir bölünmüş ekranda (başlatıcı yan tarafta), odaklanılamadığı için üstteki etkinlik devam ettirilmiyor.
  • Pencere içinde pencere modunda, odaklanılamadığı için etkinlik devam ettirilmiyor.
  • Etkinlikler aynı yığındaki diğer şeffaf etkinlikler tarafından kapsandığında.

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

Önceki Android sürümlerinden gelen devam ettirildi sinyalini korumak (ve uygulamaların, özel erişim veya tekil kaynaklara ne zaman erişmesi gerektiğini bildirmek) için Android 10'da yeni bir geri çağırma işlevi bulunur:

Activity#onTopResumedActivityChanged(boolean onTop)

Bu geri çağırma, çağrıldığında Activity#onResume() ile Activity#onPause() arasında çağrılır. Bu geri çağırma isteğe bağlıdır ve atlanabilir. Bu nedenle, bir etkinlik sistemde en üstte yer almadan RESUMED durumundan PAUSED durumuna geçebilir. Örneğin, çoklu pencere modunda. Bu geri çağırma isteğe bağlı olduğundan Activity Lifecycle'ın bir parçası değildir ve nadiren kullanılmalıdır.

Önceki en üstte devam ettirilen etkinlik, yöntem çağrısını işlemek için çok fazla zaman harcamadığı ve 500 ms zaman aşımına uğramadığı sürece, bir sonraki en üstte devam ettirilen etkinlik onTopResumedActivity(true) almadan önce onTopResumedActivity(false) yürütülmesini alır ve tamamlar.

Uyumluluk

Çoklu devam ettirme özelliğini uygularken uyumluluğu korumak için bu çözümleri göz önünde bulundurun.

Tek bir uygulama sürecinde birden fazla devam ettirilen etkinlik

  • Sorun. Android 9 ve önceki sürümlerde, sistemdeki yalnızca bir etkinlik aynı anda devam ettirilir. Etkinlikler arasındaki tüm geçişlerde, bir etkinlik duraklatılıp diğeri devam ettirilir. Bazı uygulamalar ve çerçeveler (ör. Flutter veya Android'in LocalActivityManager'ı) bu bilgiyi kullanır ve devam ettirilen etkinlikle ilgili durumu tekil nesnelerde saklar.
  • Çözüm Android 9 ve önceki sürümlerde, aynı işleme ait iki etkinlik de devam ettirilirse sistem yalnızca Z sırasındaki daha yüksek etkinliği devam ettirir. Android 10'u hedefleyen uygulamalar, aynı anda birden fazla etkinliğin devam ettirilmesini destekleyebilir.

Aynı anda kamera erişimi

  • Sorunlar. Bu sorunlar Android 9 ve önceki sürümlerde de görülür. Örneğin, tam ekran ve devam ettirilen bir etkinlik, pencere içinde pencere modunda üstteki duraklatılmış bir etkinliğe odaklanmayı kaybedebilir ancak çoklu pencere ve çoklu ekran modlarının daha yaygın kullanılmasıyla daha fazla görünür hale gelebilir.
    • RESUME durumunda yapılan değişiklikler nedeniyle uygulamaların devam ettirilirken bile kamerayla bağlantısı kesilebilir. Bu sorunu gidermek için uygulamaların, kamera bağlantısı kesildiğinde kilitlenmemesi gerekir. Bağlantı kesildiğinde uygulamalar bağlantının kesildiğine dair geri arama alır ve API'ye yapılan tüm çağrılar CameraAccessException hatası vermeye başlar.
    • resizeableActivity=false, kameraya özel erişim garantisi vermez. Çü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ığı eklemelidir. Bir uygulamanın kamerayla bağlantısı kesilirse yeniden bağlanmayı denemek ve kamera kullanımına devam etmek için kameranın kullanılabilirliği geri çağırmalarını izlemesi gerekir. Android 10, mevcut CameraManager#AvailabilityCallback#onCameraAvailable() geri çağırmasına ek olarak CameraManager#AvailabilityCallback#onCameraAccessPrioritiesChanged() geri çağırmasını da ekledi. Bu geri çağırma, odak (ve kamera önceliği) birkaç devam ettirilen etkinlik arasında değiştiğinde geçerlidir. Uygulama geliştiriciler, kameraya erişmeye çalışmak için uygun zamanı belirlemek üzere bu geri çağırma işlevlerinin 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 etkinlikteki görünürlük güncellemelerinden sonra doğru durumun sağlanması ve hangi yaşam döngüsü durumunun geçerli olduğunun değerlendirilmesi için ActivityRecord#makeActiveIfNeeded() yöntemini farklı konumlardan ç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ğe devam etme, sistemdeki tek bir konumda değil, her yığında ayrı ayrı izlenir. Bunun nedeni, çok pencereli modlarda aynı anda birden fazla etkinlik geçişi yapılabilmesidir. Ayrıntılı bilgi için ActivityStack#mInResumeTopActivity başlıklı makaleyi inceleyin.

En çok devam ettirilen etkinlik geri araması

En üstteki etkinlik değişikliğine neden olabilecek işlemlerden (ör. etkinlik başlatma, devam ettirme veya Z sırası değişikliği) sonra ActivityStackSupervisor#updateTopResumedActivityIfNeeded() çağrılır. Bu yöntem, en üstteki devam ettirilen etkinliğin değişip değişmediğini kontrol eder ve gerekirse güncellemeyi gerçekleştirir. Önceki en son devam ettirilen etkinlik, en son devam ettirilen durumu serbest bırakmadıysa bu etkinliğe en son devam ettirilen durum kaybı mesajı gönderilir ve sunucu tarafında bir zaman aşımı planlanır (ActivityStackSupervisor#scheduleTopResumedStateLossTimeout()). Önceki etkinlik durumu serbest bıraktıktan sonra veya zaman aşımı gerçekleştiğinde en son devam ettirilen durumun raporu bir sonraki etkinliğe gönderilir (Kullanım alanları bölümüne bakın:

ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()

Müşterilere en çok devam ettirilen durum değişikliklerini bildirmek için yeni bir TopResumedActivityChangeItem işlem öğesi eklendi ve Android 9'daki ActivityLifecycler mimarisinden yararlanıldı.

En üstteki devam ettirilen durum istemci tarafında depolanır ve etkinlik her RESUMED veya PAUSED durumuna geçtiğinde onTopResumedActivityChanged() geri çağırma işlevinin çağrılıp çağrılmayacağı da kontrol edilir. Bu, yaşam döngüsü durumlarının ve en üstteki devam ettirilen durumun sunucu ve istemci tarafları arasındaki iletişiminde belirli bir ayrışmaya olanak tanır.