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ılarCameraAccessException
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 olarakCameraManager#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.