Süreçler ve uygulama yaşam döngüsü

Ç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:

  1. Ö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:
  2. 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.

  3. 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ı, önceki Activity öğ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) bir Service'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.

  4. 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çse AlarmManager 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.

  5. Ö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ğunda Activity 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ı durumunda onDestroy() çağrısının garanti edilmediğini unutmayın. Ayrıntılı bilgi için Activity 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.

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.