Android 9 (ve önceki sürümler) sürümlerinde uygulamalar aşağıdaki durumlarda PAUSED
durumuna giriyordu:
- Uygulama hâlâ görünürken (dolayısıyla da durdurulmamışken) uygulamanın üst kısmında yeni, yarı saydam bir etkinlik başlatıldı.
- Etkinlik odağını kaybetti, ancak gizlenmedi ve kullanıcı tarafından etkileşim kurulabilir durumdaydı. Örneğin, çoklu pencere modunda birden fazla etkinlik görünür durumda olabilir ve aynı anda dokunmatik giriş alabilir.
Bu durumlar bir uygulamanın yapması gereken duraklatma miktarı açısından farklılık gösterir ancak uygulama düzeyinde ayırt edilemez.
Android 10'da, görünür gruplardaki tüm en üstte odaklanılabilir etkinlikler RESUMED
durumundadır. Bu, kullanıcı arayüzünü yenilemeyi durdurmak ve kullanıcıyla etkileşimi sonlandırmak için onStop()
yerine onPause()
kullanan uygulamalarda Çoklu Pencere ve MD modlarıyla uyumluluğu iyileştirir. 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 etkinliklere devam edilir.
- Birden fazla ekrandaki etkinlikler aynı anda devam ettirilebilir.
Şekil 1. Katlanabilir cihazlarda birden fazla videoyu devam ettirme
Şekil 2. Masaüstü modunda birden fazla videoyu devam ettirme
Aşağıdaki gibi odaklanamayacak veya kısmen örtülmüş etkinlikler PAUSED
durumunda olabilir:
- En üstteki etkinlik, odaklanabildiği için en aza indirilmiş bölünmüş ekranda (yan tarafta başlatıcıyla) devam ettirilmez.
- Pencere içinde pencere modunda ise odaklama olmadığından etkinlik devam ettirilmez.
- Etkinlikler, aynı gruptaki diğer şeffaf etkinlikler tarafından kapsandığında.
Bu yaklaşım, uygulamalara bir etkinliğin yalnızca RESUMED
durumundaki bir kullanıcıdan giriş alabileceğini belirtir. Android 10'dan önce etkinlikler PAUSED
durumunda da giriş alabilirdi (örneğin, Android 9 çalıştıran bir cihazda bölünmüş ekranda iki etkinliğe aynı anda dokunmayı deneyin).
Önceki Android sürümlerindeki devam ettiriliyor 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 yer alır:
Activity#onTopResumedActivityChanged(boolean onTop)
Bu geri çağırma işlevi, ç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.
Böylece, bir etkinlik, sistemin en üstünde yer almadan bir 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 etkinlik, yöntem çağrısını işlemesi çok uzun sürmediği ve 500 ms zaman aşımına ulaşmadığı sürece, en son devam ettirilen önceki etkinlik onTopResumedActivity(false)
'ü alır ve yürütmeyi tamamlar, ardından en son devam ettirilen sonraki etkinlik onTopResumedActivity(true)
'ü alır.
Uyumluluk
Birden fazla özgeçmişi uygularken uyumluluğu korumak için aşağıdaki çözümleri değerlendirin.
Tek bir uygulama sürecinde birden fazla devam ettirilen etkinlik
- Sorun. Android 9 ve önceki sürümlerde sistemdeki aynı anda yalnızca bir etkinlik devam ettirilir. Etkinlikler arasındaki tüm geçişler, bir etkinliği devam ettirmeden önce duraklatmayı içerir. Bazı uygulamalar ve çerçeveler (ör. Flutter veya Android'in LocalActivityManager) bu gerçeği kullanır ve devam ettirilen etkinlikle ilgili durumu tekil nesnelerde depolar.
- Çözüm. Android 9 ve önceki sürümlerde, aynı işleme ait iki etkinlik de devam ettirilirse sistem yalnızca Z sırasına göre daha yüksek olan etkinliği devam ettirir. Android 10'u hedefleyen uygulamalar, aynı anda birden fazla etkinliğin devam etmesini destekleyebilir.
Aynı anda kamera erişimi
- Sorunlar. Bu sorunlar Android 9 ve önceki sürümlerde de mevcuttur. Örneğin, tam ekran ve devam ettirilen bir etkinlik, kameranın odağını pencere içinde pencere modunda duraklatılan bir etkinliğe bırakabilir. Ancak çoklu pencere ve çoklu ekran modlarının daha yaygın bir şekilde benimsenmesiyle daha fazla görünürlük elde edebilir.
RESUME
durumunda yapılan değişiklikler nedeniyle, uygulamalar devam ettirilirken bile kamerayla bağlantısını kaybedebilir. Bu sorunu gidermek için uygulamaların, kamera bağlantısının kesilmesini kilitlenmeden ele alması gerekir. Bağlantı kesildiğinde uygulamalara bağlantı kesildiğine dair bir geri çağırma çağrısı gönderilir ve API'ye yapılan tüm çağrılardaCameraAccessException
hatası gösterilmeye başlar.- Kamerayı kullanan diğer uygulamalar diğer ekranlarda açılabileceğinden
resizeableActivity=false
, kameraya özel erişim garantisi vermez.
- Çözümler. Geliştiriciler, uygulamanın kamerayla bağlantısının kesildiği durumlar için mantık eklemelidir. Bir uygulamanın kamerayla bağlantısı kesilirse yeniden bağlanıp kamera kullanımına devam etmek için kamera kullanılabilirlik geri çağırmalarını izlemelidir. Mevcut
CameraManager#AvailabilityCallback#onCameraAvailable()
geri çağırma işlevine ek olarak Android 10, odağın (ve kamera önceliğinin) devam eden birkaç etkinlik arasında geçiş yaptığı durumları kapsayanCameraManager#AvailabilityCallback#onCameraAccessPrioritiesChanged()
işlevini ekledi. Uygulama geliştiriciler, kameraya erişmeye çalışmanın uygun bir zamanını belirlemek için bu geri çağırmalardan ikisini de kullanmalıdır.
Çoklu devam ettirme
Android 10'da etkinlik yaşam döngüsü durumu, görünürlüğe ve Z sırasına göre belirlenir. Bir etkinlikte görünürlük güncellemelerinden sonra doğru durumun sağlandığından emin olmak ve hangi yaşam döngüsü durumunun geçerli olduğunu değerlendirmek 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ğin devam ettirilme durumu sistemdeki tek bir konum yerine her yığınta ayrı olarak 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 çağırma
Üst etkinlik değişikliğiyle sonuçlanabilecek 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 ü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 etkinlik en çok devam ettirilen durumu serbest bırakmadıysa ona bir en çok 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 bir zaman aşımı oluştuğunda bir sonraki etkinliğe en çok devam ettirilen durum raporu gönderilir (şunların kullanımlarına bakın:
ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()
Android 9'daki ActivityLifecycler
mimarisinden yararlanan ve istemcilere en çok devam ettirilen durum değişikliklerini bildirmek için yeni bir TopResumedActivityChangeItem
işlem öğesi eklendi.
En üstte devam ettirilen durum istemci tarafında depolanır ve etkinlik RESUMED
veya PAUSED
durumuna her geçiş yaptığında onTopResumedActivityChanged()
geri çağırma işlevinin çağrılıp çağrılmayacağını da kontrol eder. Bu, sunucu ve istemci tarafları arasında yaşam döngüsü durumlarının ve en son devam ettirilen durumun iletişiminde belirli bir şekilde ayrılmayı sağlar.