Android Uygulamalarının Bileşenleri ve Bileşenlerin Yaşam Döngüsü

Android için uygulama geliştirmeye başlamadan önce ilk olarak uygulamaların nasıl çalıştığına ve hangi kısımlardan oluştuğuna bakmakta yarar vardır. Çünkü her uygulamanın bir yaşam döngüsü vardır, bir sistem üzerinde geliştirilen  uygulama çeşitleri vardır ve en önemlisi de sistemin bu uygulamaları işletme ve zaman içerisinde sistem kaynaklarını yönetme şekli vardır. Windows ya da linux nasıl uygulamaları ve prosesleri bellekte ve diskte belirli algoritmalara göre tutuyor ve yönetiyorsa, android sistemi de uygulamaları ve diğer platformlara göre daha çok sınırlı olan sistem kaynaklarını yönetir.

Android Uygulamalarının Bileşenleri:
Geliştireceğimiz android uygulamaları 4 temel kısım üzerine inşa ediliyorlar. Bu temel kısımlar;
  1. Aktiviteler(Activities): Aktiviteler çalıştırılabilir kodun belirli kısımlarını oluşturan ve zamanın belirli bölgelerinde kullanıcı ile ve sistemle etkileşime geçerek gerekli veriyi  sağlayan, sonunda da kullanılmadıkları zaman sistem tarafından sonlandırılan parçalardır.
  2. Servisler (Services): Servisler bilgisayarlardan da tanıdık olduğumuz arkaplanda çalışan ve uygulamanın bir parçası olan kısımlardır. Aygıt kapanana kadar arkaplanda hazır olarak çalışırlar.Genellikle kullanıcı arayüzü olarak sunulmazlar. Uygulamaların ihtiyacı olan verilerin ve hizmetlerin sağlanmasında kullanılırlar.
  3. Broacast and Intent Receivers: Broadcasting işlemi bilinen broadcast uygulamaları gibi aygıtın temel mesajlarının tüm sisteme gönderilmesidir.Düşük pil uyarısı yada zaman dilimi değiştirilmesi gibi olaylarda aygıt, uygulamaların tümünü bu durumlardan haberdar eder. Intent receivers ise belirli bir amaca göre bazı varolan uygulamalardan ve servislerden bilgi toplanmasıdır. Varolan bir uygulamayı kullanarak uygulama geliştirildiğinde bu tür olay yakalayıcılar kullanılır.
  4. İçerik Sağlayıcılar(Content Provider): Aygıt üzerindeki uygulamalar dosya sisteminde yada dosya sistemi üzerindeki SQLite veritabanı üzerinde uygulamaya ait verileri saklarlar. Diğer uygulamaların da belirli veri tiplerine uygun olarak bu verileri kullanabilmesi Content Provider ile sağlanır. Content provider uygulamalara bu verilere erişim için bazı metodlar sunar. 
Kısaca uygulamamızı oluşturan önemli temel kısımları incelemiş olduk. Bu kısımların nasıl çalıştığına ve yaşam çevrimlerine bakacak olursak uygulama geliştirirken bileşenlerin rolleri hakkında daha net bilgi sahibi olabiliriz.

Bileşenlerin Aktifleştirilmesi: 

Bir aktivite Context.startActivity() ve Activity.startActivityForResult() methodları ile aktifleştirilir. Burada intent nesnesi karşımıza çıkar.  Intent nesneleri broadcast receiversi servisler ve aktiviteleri aktifleştiren asenkron mesajlardır. Intent nesneleri mesaja ait bilgileri saklar.  Örnek olarak aktivite ve servisler için isteğin yapıldığı durumu ve verinin konumunu tutabilir.Aktivitelerin aktifleştirilmesi için de Intent nesnelerinin yukarıdaki metodlara parametre olarak geçilmesi gerekir. Eğer aktivitenin sonuç döndürmesi bekleniyorsa Activity.startActivityForResult() metodu kullanılır. Aksi halde Content.startActivity() metodu kullanılır.
Bir servis ise Context.startService()  metoduna Intent nesnesinin parametre olarak geçilmesiyle aktifleştirilir. Burada android onStart() methodunu çağırır(Intent nesnesini bu metoda göndererek) ve servis başlatılmış olur.  Aynı şekilde Context.bindService() metodu ile dedevam eden bir bağlantıya tekrar devam edebilir.
Bir uygulama broadcast mesajları göndermek için Intent nesnesini context.sendBroadcast() context.sendOrderedBroadcast() context.sendStickyBroadcast() metodlarından birisine gönderebilir.

Bileşenlerin Durdurulması:
Bir Content Provider, Content Resolver'a cevap verdiği sürece aktiftir. Aynı şekilde broadcast receiver bir broadcast mesajına cevap verdiği sürece aktiftir. Yani kesin olarak bu bileşenlerin kapatılması gibi bir durum da yoktur. Aktivite ve servisler ise farklıdır ve özel metodlarla bu bileşenler durdurulur. Aktivite finish() metodu ile durdurulur. Bir aktivite diğer bir aktiviteyi durdurabilir. Bunu yaparken finishActivity() metodunu kullanır. Bir servisin kapatılmasında ise stopSelf() veya Context.stopService() metodlarını çağırmak gerekir.

Manifest Dosyaları:
Android uygulamaları başlamadan önce hangi bileşenlerden oluşuyor olduğunu bilmelidir. Bu sebepten dolayı Android uygulamaları android uygulama paketi içinde gömülü olarak manifest dosyasını bulundurmalıdır. .apk dosyasında ayrıca uygulama kodu, dosyaları ve kaynaklar bulunabilir.
Manifest dosyası XML formatındadır ve her android uygulamasında AndroidManifest.xml olarak bulunur. 

Bileşen Yaşam Döngüleri:
Uygulama bileşenleri bir yaşam döngüsüne sahiptirler. Uygulamalar başlangıç ve son arasında aktif ve inaktif modda olabilirler. Bu modlar arası geçişte uygulama sonlandırılabilir ya da  yokedilebilir. 

Aktivite Yaşam Döngüsü: 
 Bir aktivite 3 duruma sahip olabilir;




    • Aktif ya da çalışır durumda uygulama kullanıcıya odaklanmıştır ve kullanıcıdan gelecek verilere göre sonuçlar üretilir.
    • Bekleme modunda başka bir uygulama çalışmaya başlamış, uygulama arkaplana itilmiş fakat aynı şekilde çalışmaya devam etmektedir. Uygulama bekleme modunda düşük bellek durumlarında sistem tarafından yokedilebilir.
    • Durdurulmuş durumda uygulama tamamen çalışmaz durumdadır buna rağmen en son verilere sahiptir. Uygulamaya ayrılmış bellek sistem tarafından gerektiğinde kullanılabilir. 
Aktivite bir durumdan diğer duruma geçerken aşağıdaki metodları çalıştırır.(hook)

void onCreate(Bundle savedInstanceState)
void onStart()
void onRestart()
void onResume()
void onPause()
void onStop()
void onDestroy()


Bu durum geçişlerinde yapacağımız işlerde yukarıdaki metodları override ederek kullanabiliriz. Tüm aktiviteler onCreate() metodunu implement etmek zorundadırlar. Ayrıca çoğu uygulama onPause() metodunu da implement edecektir.
Uygulamanın tüm yaşamı onCreate() ile onDestroy() arasındaki geçen zaman arasındadır.
Uygulamanın yaşam döngüsü hakkındaki şemayı dökümantasyon web sitesindeki hali ile vermeyi uygun gördüm. Aşağıdaki şemada durum geçişleri ve metodlar görülebilir.

Şimdi kısaca geçiş durumu metodlarını ve yaşam döngüsündeki sıralamalarına bakalım;
onCreate():Aktivite ilk defa çalıştırıldığında çalışan metod. onCreate() sonrasında her zaman onStart() metoduna geçiş yapılmış olur.
onRestart(): Aktivite onStop() ile durdurulduktan sonra yeniden başlatıldığında  geçilen durumda çalıştırılan metoddur. Bu metodu onStart() metodu izler.
onStart(): Uygulama kullanıcıya uygun hale geldiğinde çalıştırılan metoddur. Aktivite önplanda çalışmaya başlayacaksa onResume(), gizlenecekse onStop() metodu bu metodu izler.
onResume(): Aktivite kullanıcı ile etkileşime geçmeden önce çalıştırılan metoddur. Sonrasında kullanıcı uygulamayı kullanmaya başlar. Sonrasında her zaman onPause() metodu izler.
onPause(): Android diğer bir uygulamaya devam edeceği zaman geçilen durumda çağrılan metoddur. Bu metod ile uygulama kaydedilmemiş verileri kaydeder ve animasyonları durdurma gibi birçok farklı işlemi yapar. Eğer uygulama devam edecekse bu metodu onResume() izler. Eğer uygulama durdurulacaksa onStop() metodu ile devam edilir.
onStop(): Uygulama durdurulduğunda bu metod çalıştırılmış olur. Bu durum geçişinden sonraki gelebilecek durumlar uygulamanın tekrar çalıştırılması, onRestart() ya da uygulamanın tamamen kapatılması ,onDestroy() metodunun çağrılmasıdır.
onDestroy(): Uygulama yokedilmeden önce çağrılan metoddur. Bu çağrı yapılacak son çağrıdır ve sonrasında uygulama bellekten gerektiğinde silinecektir.
onDestroy() , onStop() ve onPause() durumlarında uygulama sistemin belleğe gereksinim duyması durumlarında tamamen bellekten yokedilebilir. Bu durumu göz önüne almak gerekir.

Servis Yaşam Döngüsü:
Servisler kullanım biçimi olarak iki şekilde kullanılabilirler.
  • Herhangi birisi tarafından başlatılıp sonlandırılmasına izin verilebilir. Bu durumda uygulama servisi Context.startService() metodu ile başlatır ve Context.stopService() metodu ile sonlandırır. Ya da servis kendini Service.stopSelf() ya da Service.stopSelfResult metodlarıyla sonlandırabilir.
  • Diğer modelde ise programatik olarak bir arayüz kullanılarak bu işlemler gerçekleştirilebilir. Kullanıcılar Context.bindService()  metoduyla servise bağlantıyı sağlayabilir ve Context.unbindService() metodu ile servisle bağlantısını kapatabilir. Bu bağlantı yönteminde birden çok client eş zamanlı olarak bağlantı açıp bağlantı kapatabilir. 
Ayrıca bu modellerde önce startService() metodu ile servis başlatılıp yeniden servisin kullanımına ihtiyaç duyulduğunda bindService() metodu kullanılabilir. Bu durumda da tüm clientlar bağlantıyı kapatana kadar yapılan stopService() metod çağrıları bağlantının kapanmasını bekleyeceklerdir.Yine servisin yaşam döngüsündeki durumları arasında geçiş yaparken çalıştırılan metodlar mevcuttur;   
void onCreate() 
void onStart(Intent intent) 
void onDestroy() 
IBinder onBind(Intent intent) 
boolean onUnbind(Intent intent) 
void onRebind(Intent intent)


Her servisin yaşam döngüsü onCreate() ile başlar ve onDestroy() metoduna kadar devam eder. Aktif olarak servisin çalıştığı kısım ise onStart() metodu sonrasıdır.

Broadcast Receiver Yaşam Döngüsü:
Bir broadcast mesajı alıcıya ulaştığında android onReceive() metodunu çağırır ve Intent nesnesini mesajı da içeren bir şekilde bu metoda aktarır. Broadcast Receiver  bileşeni tek metodu olan onReceive() çalışıyorken aktif olarak kabul edilir. Diğer zamanlarda broadcast receiver inaktiftir.
void onReceive(Context currentContext, Intent broadcastMessage)

Buraya kadar olan kısımda uygulamaların genel özelliklerini inceledik. Bu kısımların anlaşılması ilk zamanlarda biraz zor olsa da uygulama geliştirmeye başlamadan önce bazı temel bilgileri önceden almak ilerde uygulama geliştirme konusunda karşılaşılan sıkıntıları en aza indirecektir. Gelecek yazımızda görüşmek üzere.
Written on July 26, 2010