21 Mayıs 2011 Cumartesi

Android Serisi 1. Bölüm - Android'in Temelleri

Merhaba, uzun zamandır baştan sona android ile ilgili bir set hazırlayıp, siz değerli yazılımcı arkadaşlarımla paylaşmak istiyordum. Ancak yoğun çalışma temposu, bilgisayarımın dandikliği ve bir şeyler yazmaktan erinecek kadar tembel birisi olmam bu isteğimin bir türlü gerçekleşmemesine neden oldu.

Aslında görsel bir paylaşımda bulunmak yerine makale hazırlamak -bence- son derece yanlış bir tercih. Görsel bir eğitimin yerini başka hiçbir şeyin tutmayacağını düşünüyorum. Ancak şu an bilgisayarım bir nedenden ötürü ses kaydı yapamıyor. Bundan dolayı -en azından şimdilik-, makalelerle idare etmemiz gerekmekte. Bu paylaşımı, çözüm bulur bulmaz videolarla daha katılımcı ve hızlıca anlaşılır bir şekle sokacağımdan emin olabilirsiniz. Neyse lafı çok uzattık dilerseniz hemen konumuza girelim.

ANDROID'İN TEMELLERİ:

Bir Android Uygulaması Temelde Hangi Kavramlardan Oluşur?
  1. Activity: Uygulamadaki her bir ekran aslında bir activity'dir ve Activity class'ından extend edilir. .NET tarafındaki ASPX dosyasının Android'deki karşılığıdır diyebiliriz. Activityler, View nesnelerini kullanarak işlem gerçekleştirirler. 
  2. Service: Arkaplanda çalışırlar ve bu esnada Activitylerle veya datasource gibi diğer nesnelerle etkileşimde bulunabilirler. 
  3. Content Provider: Uygulamalar arası data paylaşımını sağlamak için kullanılır. Kısaca paylaşılabilir veri depolarıdır diyebiliriz.
  4. Intent: Activityler, serviceler, vs gibi nesneler arası mesajlaşmayı sağlayan yapılardır. (Activityler ile birlikte en çok kullanılan nesnelerden biridir)
  5. Broadcast Receiver: Uygulamayla ilişkili intentlerin dinlenmesine imkan sağlayan yapılardır.

Bir Android Uygulamasının Yaşam Döngüsü Nasıldır?
  1. Aktiftir: An itibariyle kullanıcı tarafından kullanılmakta olan uygulamadır.
  2. Aktif değildir ancak "Visible" konumdadır: O an aktif olarak kullanılmamakla beraber memory'de yaşamaya devam etmektedir. Transparan konumdadır diyebiliriz.
  3. Visible değildir ancak "Arkaplandadır": An itibariyle hiçbir servisinin kullanılmadığı uygulamadır. Android tarafından otomatik olarak dispose edilirler.
  4. Pasiftir (Inactive): Uygulama, Android tarafından kill edilmiştir.
Bu döngüyü kafada daha iyi canlandırabilmek için iskambil kağıtlarını tutan bir el örneğinin çok da yanlış olmayacağını düşünüyorum. Evet lütfen gözünüzün önüne aşağıdaki resimdeki gibi iskambil kağıtlarını tutan bir el getirin. Bu resme göre bir analoji kuracak olursak diyebiliriz ki kupa as aktif olan activity'dir. Diğerleri visible konumdadırlar. Maça kızı kupa as'ın yerine geçtiğinde maça kızı aktif konuma gelmiş olacaktır, last active activity (en son aktif olan activity) ise kupa as olmuş olacaktır. Bu şekilde düşünmeye devam edecek olursak belli bir süre sonra Android tarafından ilk kill edilecek uygulama kupa papaz olacaktır. (bknz: last-seen-first-killed pattern, http://mobworld.wordpress.com/2010/07/05/memory-management-in-android/)

 


ACTIVITY YAŞAM DÖNGÜSÜ
Activityleri kullanmadan önce activitylerin nasıl bir yaşam döngüsüne sahip olduklarını bilmemiz çok önemli. Yaşamı boyunca hangi eventlerin hangi zamanlarda raise edildiği ve bu esnada uygulamanın ne aşamada olduğunu bilmemiz uygulama geliştirme aşamasında bizleri çok daha bilinçli hareket etmeye sevk edecektir.

Bir activity'nin yaşam döngüsü aşağıdaki gibidir.


Aslında yukarıdaki şema herşeyi son derece açık bir şekilde anlatıyor. Ancak yine de biz üstünden bir özet geçelim. Şimdi, siz bir uygulamayı çalıştırmak için tetiklediğinizde bilmelisiniz ki önce onCreate event'i raise edilmiş olacaktır. Yani activity initiliaze edilecektir. Buradan sonra onStart eventi fırlatılır. onStart eventinde activity artık visible'dır ancak hala aktiflik söz konusu değildir, UI bilgisi burada uygulanır. onResume eventinde ise activity artık aktiftir. onResume'dan sonra bu şemada gösterilmeyen onSaveInstanceState eventine girilir. Bu evente gelen Bundle (web uygulamalarındaki session veya hashtable nesnesinin benzeri bir yapıdır), eğer proses uçurulmuşsa (kill edilir) veya restart edilmişse onCreate eventine UI state değişikliklerini gönderir. Daha sonra onPause eventine geçilir. Activity önplanda değil askıya alınmıştır yani artık aktif değildir. onStop eventinde activity kill edilmek için beklemekte, onDestroy'da onCreate eventinde initiliaze edilmiş tüm kaynaklar, tüm connectionlar (network ve database connectionları gibi) dispose edilmektedir. Bazı durumlarda onDestroy methodu call edilmeden de proses terminate olabilir.

Artık ne yaptıklarını bildiğimize göre hangi aşamada hangi methodu kullanmamız gerektiğini de söyleyebiliriz.

onCreate; UI ve class değişkenlerini oluştururken, kontrollere data bağlarken ve service veya thread oluştururken

onStop: animasyonları, threadleri, sensör dinleyicilerini (sensor listeners), GPS aramalarını, zamanlayıcıları, servisleri durdururken

onStart: UI visible olduğunda onStop eventinde kapatılmış olanları tekrar çalıştırmak amacıyla (Ilk açılış haricinde)

onPause: Broadcast Receiverları durdururken

onResume: Broadcast Receiverları tekrar çalıştırırken kullanın.

3 yorum: