Çoğu durumda her Android uygulaması kendi Linux işleminde çalışır. Bu işlem, kodunun bir kısmının çalışması gerektiğinde uygulama için oluşturulur ve sistem diğer uygulamalar tarafından kullanılmak üzere belleğini geri aldığında ve artık ihtiyaç duyulmadığında çalışmaya devam eder.
Android'in alışılmadık ve temel özelliklerinden biri, uygulama sürecinin ömrünün doğrudan uygulama tarafından kontrol edilmemesidir. Bunun yerine, sistem tarafından uygulamanın çalıştığı bilinen kısımların, bu kısımların kullanıcı için ne kadar önemli olduğunun ve sistemde ne kadar genel bellek bulunduğunun bir kombinasyonuyla belirlenir.
Uygulama geliştiricilerin, farklı uygulama bileşenlerinin (özellikle Activity
, Service
ve BroadcastReceiver
) uygulama sürecinin ömrünü nasıl etkilediğini anlaması önemlidir. Bu bileşenleri doğru şekilde kullanmamak, sistem önemli bir iş yaparken uygulamanın sürecini sonlandırabilir.
Süreç yaşam döngüsü hatası için yaygın bir örnek, BroadcastReceiver.onReceive()
yönteminde Intent
aldığında bir iş parçacığı başlatan ve ardından işlevden dönen bir BroadcastReceiver
'tir. Bu işlem tamamlandıktan sonra sistem, BroadcastReceiver
'ün artık etkin olmadığını ve içinde başka uygulama bileşenleri etkin olmadığı sürece barındırma işlemine artık ihtiyaç olmadığını düşünür.
Bu nedenle sistem, belleği geri almak için işlemi istediği zaman sonlandırabilir ve bu işlem sırasında, işlemde çalışan oluşturulan iş parçacığını sonlandırır. Bu sorunun çözümü genellikle, sistemin süreçte etkin bir çalışma olduğunu bilmesi için BroadcastReceiver
'dan bir JobService
planlamaktır.
Android, bellek azaldığında hangi işlemlerin sonlandırılacağını belirlemek için her bir işlemi, çalıştırılan bileşenlere ve bu bileşenlerin durumuna göre bir önem hiyerarşisine yerleştirir. Önem sırasına göre bu işlem türleri şunlardır:
- Ön plan işlemi, kullanıcının şu anda yaptığı işlem için gereken işlemdir. Çeşitli uygulama bileşenleri, içeren sürecinin farklı şekillerde ön planda kabul edilmesine neden olabilir. Aşağıdaki koşullardan herhangi biri geçerliyse bir işlemin ön planda olduğu kabul edilir:
- Kullanıcının etkileşimde bulunduğu ekranın üst kısmında bir
Activity
çalıştırılıyor (onResume()
yöntemi çağrıldı). - Şu anda çalışan bir
BroadcastReceiver
vardır (BroadcastReceiver.onReceive()
yöntemi yürütülmektedir). - Şu anda geri çağırmalarından birinde (
Service.onCreate()
,Service.onStart()
veyaService.onDestroy()
) kod yürüten birService
vardır.
- Kullanıcının etkileşimde bulunduğu ekranın üst kısmında bir
- Görünür bir işlem, kullanıcının şu anda farkında olduğu bir iş yapıyordur. Bu nedenle, işlemin sonlandırılması kullanıcı deneyiminde belirgin bir olumsuz etkiye sahiptir. Bir işlem aşağıdaki durumlarda görünür olarak kabul edilir:
- Kullanıcının ekranda görebildiği ancak ön planda olmayan bir
Activity
çalıştırıyor (onPause()
yöntemi çağrıldı). Bu durum, örneğin ön plandakiActivity
, öncekiActivity
'ün arkasında görülebilmesini sağlayan bir iletişim kutusu olarak gösterilirse ortaya çıkabilir. Service.startForeground()
aracılığıyla ön plan hizmeti olarak çalışan birService
'si vardır (bu, sistemden hizmeti kullanıcının farkında olduğu veya görünür olduğu şekilde işleme koymasını ister).- Sistem, kullanıcının bildiği belirli bir özellik (ör. canlı duvar kağıdı veya giriş yöntemi hizmeti) için kullandığı bir hizmeti barındırıyor olabilir.
Sistemde çalışan bu işlemlerin sayısı, ön plan işlemlerine kıyasla daha az sınırlıdır ancak yine de nispeten kontrol altındadır. Bu işlemler son derece önemli kabul edilir ve tüm ön plan işlemlerinin çalışmaya devam etmesi için gerekli olmadığı sürece sonlandırılmaz.
- Kullanıcının ekranda görebildiği ancak ön planda olmayan bir
- Hizmet işlemi,
startService()
yöntemiyle başlatılmış birService
içeren işlemdir. Bu işlemler kullanıcı tarafından doğrudan görülemese de genellikle kullanıcının önemsediği işlemleri (ör. arka planda ağ verisi yükleme veya indirme) gerçekleştirir. Bu nedenle, tüm ön plan ve görünür işlemleri tutacak yeterli bellek olmadığı sürece sistem bu tür işlemleri her zaman çalışır durumda tutar.Uzun süredir (ör. 30 dakika veya daha uzun) çalışan hizmetler, işlemlerinin önbelleğe alınmış listeye düşmesine izin vermek için önem açısından düşürülebilir.
Uzun bir süre boyunca çalıştırılması gereken süreçler
setForeground
ile oluşturulabilir. Kesin bir yürütme zamanı gerektiren düzenli bir işlemseAlarmManager
aracılığıyla planlanabilir. Daha fazla bilgi için Uzun süre çalışan çalışanlar için destek başlıklı makaleyi inceleyin. Bu sayede, aşırı kaynak kullanan uzun süre çalışan hizmetlerin (ör. bellek sızıntısı yaparak) sistemin iyi bir kullanıcı deneyimi sunmasını engellediği durumlar önlenebilir. - Önbelleğe alınmış bir işlem şu anda ihtiyaç duyulmayan bir işlemdir. Bu nedenle, sistem başka bir yerde bellek gibi kaynaklara ihtiyaç duyduğunda gerektiği gibi bu işlemi sonlandırabilir. Normal şekilde çalışan bir sistemde, kaynak yönetimiyle ilgili tek süreçler bunlardır.
İyi çalışan bir sistemde, uygulamalar arasında verimli geçiş yapmak için her zaman hazır olan birden fazla önbelleğe alınmış işlem bulunur ve gerektiğinde önbelleğe alınmış uygulamalar düzenli olarak kapatılır. Sistem yalnızca çok kritik durumlarda tüm önbelleğe alınmış işlemlerin sonlandırıldığı ve hizmet işlemlerini sonlandırmaya başladığı bir noktaya gelir.
Önbelleğe alınan işlemler sistem tarafından herhangi bir zamanda sonlandırılabileceğinden, uygulamalar önbelleğe alınmış durumdayken tüm çalışmalarını durdurmalıdır. Uygulamanın kullanıcı için kritik öneme sahip bir işlemi gerçekleştirmesi gerekiyorsa bu işlemi etkin bir işlem durumunda çalıştırmak için yukarıdaki API'lerden birini kullanmalıdır.
Önbelleğe alınan işlemler genellikle şu anda kullanıcı tarafından görülemeyen bir veya daha fazla
Activity
örneği içerir (onStop()
yöntemleri çağrılmış ve döndürülmüştür). Sistem bu tür işlemleri sonlandırdığındaActivity
yaşam döngüsünü doğru şekilde uyguladıkları sürece, kullanıcının ilgili uygulamaya geri dönerken yaşadığı deneyim etkilenmez. İlişkili etkinlik yeni bir işlemde yeniden oluşturulduğunda daha önce kaydedilen durum geri yüklenebilir. Bir işlemin sistem tarafından sonlandırılması durumundaonDestroy()
işlevinin çağrılmasının garanti edilmediğini unutmayın. Daha fazla bilgi içinActivity
başlıklı makaleyi inceleyin.Android 13'ten itibaren, bir uygulama işlemi yukarıdaki etkin yaşam döngüsü durumlarından birine girene kadar sınırlı veya hiç yürütme süresi alamayabilir.
Önbelleğe alınan işlemler bir listede tutulur. Bu listenin tam sıralama politikası, platformun uygulama ayrıntılarından biridir. Genellikle, kullanıcının ana ekran uygulamasını veya kullanıcının gördüğü son etkinliği barındıran işlemler gibi daha yararlı işlemleri diğer işlem türlerinden önce tutmaya çalışır. İzin verilen işlem sayısına katı sınırlar belirleme veya bir işlemin sürekli olarak önbelleğe alınabileceği süreyi sınırlama gibi, işlemleri sonlandırmaya yönelik başka politikalar da uygulanabilir.
Sistemde bu tür yalnızca birkaç işlem bulunur ve bunlar yalnızca bellek bu işlemlerin bile çalışmasını sürdüremeyecek kadar düşük olduğunda son çare olarak sonlandırılır. Genellikle bu durum, cihazın bellek sayfalama durumuna ulaştığını gösterir. Bu nedenle, kullanıcı arayüzünün duyarlı kalması için bu işlem gereklidir.
Sistem, bir işlemin nasıl sınıflandırılacağına karar verirken şu anda işlemde etkin olan tüm bileşenler arasında bulunan en önemli düzeye dayanır.
Bu bileşenlerin her birinin bir sürecin ve uygulamanın genel yaşam döngüsüne nasıl katkıda bulunduğu hakkında daha fazla bilgi için Activity
, Service
ve BroadcastReceiver
dokümanlarına bakın.
Bir işlemin önceliği, işlemin sahip olduğu diğer bağımlılıklara göre de artırılabilir. Örneğin, A işlemi Context.BIND_AUTO_CREATE
işaretiyle bir Service
'e bağlandıysa veya B işleminde bir ContentProvider
kullanıyorsa B işleminin sınıflandırması her zaman en az A işleminin sınıflandırması kadar önemlidir.