Çoğu durumda, her Android uygulaması kendi Linux işleminde çalışır. Bu işlem, kodun bir kısmının çalıştırılması gerektiğinde uygulama için oluşturulur ve sistem, başka uygulamalar tarafından kullanılmak üzere belleğini geri kazanmak zorunda olana ve artık bu koda ihtiyaç kalmayana kadar çalışmaya devam eder.
Android'in alışılmadık ve temel bir özelliği, uygulama işlemlerinin ömrünün doğrudan uygulamanın kendisi tarafından kontrol edilmemesidir. Bunun yerine, sistem tarafından sistemin çalıştığını bildiği uygulama parçalarının, bunların kullanıcı için ne kadar önemli olduğunun ve sistemde ne kadar kullanılabilir bellek alanının 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 anlamaları önemlidir. Bu bileşenlerin doğru şekilde kullanılmaması, önemli işler yaparken sistemin uygulama işlemini sonlandırmasına neden olabilir.
İşlem yaşam döngüsü hatasına yaygın bir örnek, BroadcastReceiver.onReceive()
yönteminde Intent
aldığında bir iş parçacığı başlatan ve daha sonra işlevden geri dönen BroadcastReceiver
öğesidir. Geri döndüğünde sistem, BroadcastReceiver
öğesinin artık etkin olmadığını ve içinde başka uygulama bileşenleri etkin olmadığı sürece barındırma işlemine artık gerek kalmadığını düşünür.
Bu nedenle sistem, belleği geri kazanmak için süreci herhangi bir zamanda sonlandırabilir ve bunu yaparken, süreçte çalışan ortaya çıkan iş parçacığını sonlandırır. Bu sorunun çözümü genellikle BroadcastReceiver
sisteminden bir JobService
planlamaktır. Böylece sistem bu süreçte aktif bir iş olduğunu bilir.
Android, bellek azaldığında hangi işlemlerin sonlandırılacağını belirlemek için her işlemi, içinde çalışan bileşenlere ve bu bileşenlerin durumuna göre bir önem hiyerarşisine yerleştirir. Önem sırasına göre, şu süreç türleri şunlardır:
- Ön plan süreci, kullanıcının o anda yaptığı işlem için gerekli olan bir süreçtir. Çeşitli uygulama bileşenleri, kapsayıcı işleminin farklı şekillerde ön planda kabul edilmesine neden olabilir. Aşağıdaki koşullardan herhangi birinin geçerli olması durumunda süreç ön planda 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
var (BroadcastReceiver.onReceive()
yöntemi yürütülüyor). - Şu anda geri çağırmalarından (
Service.onCreate()
,Service.onStart()
veyaService.onDestroy()
) birinde kod yürüten birService
içeriyor.
- Kullanıcının etkileşimde bulunduğu ekranın üst kısmında bir
- Görünür işlem, kullanıcının şu anda farkında olduğu bir iş gerçekleştirir. Bu nedenle, onu sonlandırmanın kullanıcı deneyimi üzerinde gözle görülür bir olumsuz etkisi vardır. Bir işlemin aşağıdaki koşullarda görülebildiği 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ı). Örneğin,Activity
ön planı, öncekiActivity
öğesinin arkasında görünmesini sağlayan bir iletişim kutusu olarak görüntüleniyorsa bu durum gerçekleşebilir. Service.startForeground()
aracılığıyla ön plan hizmeti olarak çalışan (sistemin hizmeti kullanıcının farkında olduğu veya özünde görünür gibi ele almasını isteyen) birService
'si var.- Kullanıcının bildiği belirli bir özellik (ör. animasyonlu duvar kağıdı veya giriş yöntemi hizmeti) için sistemin kullandığı bir hizmeti barındırmaktadır.
Sistemde çalışan bu işlemlerin sayısı, ön plan işlemlerine göre daha az sınırlı olsa da nispeten kontrollüdür. Bu işlemler son derece önemli olarak 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 süreci,
startService()
yöntemiyle başlatılmışService
içeren bir süreçtir. Bu işlemler doğrudan kullanıcı tarafından görülemese de, genellikle kullanıcının önem verdiği işlemler (arka planda ağ verilerini yükleme veya indirme gibi) gerçekleştirir. Böylece sistem, tüm ön plandaki ve görünür işlemleri saklamak için yeterli bellek olmadığı sürece bu tür işlemleri her zaman devam ettirir.Uzun süredir çalışan (30 dakika veya daha uzun gibi) hizmetlerin önem derecesi, işlemlerin önbelleğe alınan listeye alınması için düşürülebilir.
Uzun süre çalıştırılması gereken işlemler
setForeground
ile oluşturulabilir. Bu, sıkı yürütme zamanı gerektiren periyodik bir süreçseAlarmManager
aracılığıyla planlanabilir. Daha fazla bilgi edinmek üzere Uzun süredir çalışan çalışanlar için destek başlıklı makaleyi inceleyin. Bu, uzun süreli hizmetlerin aşırı kaynak kullanan (örneğin, bellek sızıntısı) sistemin iyi bir kullanıcı deneyimi sunmasını engellediği durumların önlenmesine yardımcı olur. - Önbelleğe alınan işlem şu anda ihtiyaç duyulmayan bir süreçtir. Böylece sistem, başka bir yerde bellek gibi kaynaklara ihtiyaç duyulduğunda bu işlemi gerektiği gibi sonlandırabilir. Normalde çalışan bir sistemde kaynak yönetimi yalnızca bu süreçlerle olur.
İyi çalışan bir sistem, uygulamalar arasında verimli geçiş yapmak için önbelleğe alınan birden fazla işleme her zaman sahiptir ve önbelleğe alınan uygulamaları gerektiğinde düzenli olarak sonlandırır. Sistem, yalnızca çok kritik durumlarda önbelleğe alınan tüm işlemlerin sonlandırıldığı ve hizmet süreçlerini sonlandırmaya başlaması gerektiği bir noktaya gelir.
Önbelleğe alınan işlemler sistem tarafından herhangi bir zamanda sonlandırılabildiği için uygulamalar, önbelleğe alınmış durumdayken tüm çalışmayı durdurur. Kullanıcı açısından kritik öneme sahip işlerin uygulama tarafından gerçekleştirilmesi gerekiyorsa uygulama, çalışmaları etkin bir işlem durumundan çalıştırmak için yukarıdaki API'leri kullanmalıdır.
Önbelleğe alınan işlemler genellikle kullanıcı tarafından görülemeyen bir veya daha fazla
Activity
örneğini içerir (onStop()
yöntemi çağrılıp döndürüldü). Sistem bu tür işlemleri durdurduğundaActivity
yaşam döngüsünü doğru şekilde uygulamışlarsa bu uygulamaya geri dönen kullanıcının yaşadığı deneyimi etkilemez. Uygulama, ilişkili etkinlik yeni bir işlemde yeniden oluşturulduğunda önceden kaydedilmiş durumu geri yükleyebilir. Bir sürecin sistem tarafından sonlandırılması durumundaonDestroy()
çağrısının garanti edilmediğini unutmayın. Ayrıntılı bilgi içinActivity
başlıklı makaleyi inceleyin.Android 13'ten itibaren, uygulama işlemleri yukarıdaki etkin yaşam döngüsü durumlarından birine girene kadar sınırlı yürütme süresi alabilir veya hiç yürütmeyebilir.
Önbelleğe alınan işlemler bir listede tutulur. Bu listenin kesin sipariş politikası, platformun uygulama ayrıntılarıdır. Genel olarak, kullanıcının ev 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 dair kesin sınırlar belirlemek veya bir işlemin sürekli olarak önbelleğe alınabileceği süreyi sınırlandırmak gibi işlemleri sonlandırmayla ilgili başka politikalar da uygulanabilir.
Sistemde bu tür çok az işlem bulunur ve bunlar ancak bu işlemlerin bile çalışmaya devam edemeyeceği kadar düşük bellek olduğunda son çare olarak devre dışı bırakılır. Genellikle bu durumda cihaz, bellek sayfalama durumuna ulaşmıştır. Dolayısıyla, kullanıcı arayüzünün duyarlı kalmasını sağlamak için bu işlem gereklidir.
Sistem, bir sürecin nasıl sınıflandırılacağına karar verirken kararını, o süreçte etkin olan tüm bileşenler arasında bulunan en önemli düzeye dayandırı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 ayrıntı için Activity
, Service
ve BroadcastReceiver
belgelerine bakın.
Bir sürecin önceliği, o sürecin sahip olduğu
diğer bağımlılıklara bağlı olarak da artırılabilir. Örneğin, A süreci Context.BIND_AUTO_CREATE
işaretiyle bir Service
işlemine bağlanmışsa veya işlem B işleminde bir ContentProvider
kullanıyorsa B işleminin sınıflandırılması her zaman en az A işleminin sınıflandırılması kadar önemlidir.