Activity Lifecycle Yönetimi
Kullanıcının
uygulamanızdan çıkıp geri gelmesi süresince yapmış olduğu gezinmeler sırasında,
uygulamanızın oluşturmuş olduğu Activity örneği kendi yaşam döngüsü içerisinde
farklı durumlara geçiş sağlar. Örneğin, activity’niz ilk sefer için
başladığında sistem tarafından ekrana çizilir ve kullanıcının ilgisine sunulur.
Bu işlem sırasında, Android sistemi kullanıcı ara yüzünü ve diğer bileşenleri
düzenleyecek activitye ait bir dizi yaşam döngüsü (lifecycle) metodu çağırır.
Eğer kullanıcı farklı bir activity başlatırsa veya farklı bir uygulamaya geçiş
yaparsa, sistem farklı bir yaşam döngüsü metodu çağırır ve uygulamanızın
activity’sini arka plana gönderir.( bu durum activity’nin görünmez durumda
olduğu fakat bir örneğinin etkileşime hazır bekletilmesi durumudur.
Bu
yaşam döngülerine ait callback metotlarında, kullanıcının ayrılıp geri geldiği
durumlarda activity’nizin ne şekilde davranması gerektiğini
tanımlayabilirsiniz. Örneğin, on-line bir video oynatıcı geliştiriyorsanız
kullanıcı uygulamanızdan geçici olarak başka bir uygulamaya geçerse videoyu
durdurabilir ve internet bağlantısını geçici olarak kesebilirsiniz. Kullanıcı
uygulamanıza geri geldiğinde ise, internete yeniden bağlanabilir ve
kullanıcının videosunun kaldığı yerden devam etmesine imkan sağlayabilirsiniz.
Bu
bölümde her bir activity örneği için kullanabileceğiniz önemli callback
metotlarını göreceğiz. Bu metotlarda sayesinde uygulamanız kullanıcı
beklentilerine cevap verirken aynı zamanda sistem kaynaklarını da verimli bir
şekilde kullanabilme yeteneğine sahip olacaktır.
Bir Activity Başlatmak
Main()
metot ile başlayan bir çok uygulamanın sahip olduğu mantığın aksine, Android
sistemi yaşam döngüsünün evrelerine karşılık gelen belirli callback metotlarını
çalıştırarak bir Activity içersinde kodları hazırlar. Bu kodlar arasında bir
dizi başlatma ve activity durdurma metodu yer almaktadır.
Bu
bölümde activity yaşam döngüsünde en önemli yer tutan callback metotlarını
inceleyeceğiz ve activitynizin ilk yaşam döngüsüne ait yen bir örnek
oluşturmanın nasıl yapılacağını inceleyeceğiz.
Yaşam Döngüsü Callback Metotlarını Anlamak
Activitynin
yaşamı süresince sitsem piramit basamaklarına benzer bir dizi temel yaşam
döngüsü metot setini çağırır. Activitye ait yaşam döngüsü metotlarının her biri
işte bu piramidin basamaklarına karşılık gelmektedir. Sistem yeni bir activity
örneği ürettiğinde, her bir callback metodu activitynin durumunu bir sonraki
duruma taşımak için kullanılır. Piramidin en tepesi activity’nin kullanıcı ile
etkileşimde olduğu konumda kullanılan metodu işaret eder.
Kullanıcı
activity’den ayrılırken, sistem activity’nin durumunu bir alt bölümler
yönlendirecek olan metotları çağırır ve activity piramitteki sıralama ile
duruma göre bir alta yer alan metoda yönlendirir.
Activity yaşam döngüsünün piramit
basamakları şeklinde basitleştirilmiş gösterimi. Bu gösterimde her bir
callback’in activity’i en üst konum olan Resumed(devam eden) duruma getirmek
için nasıl işlediğini ifade eder. Ayrıca activity Paused ve Stopped durumlardan
Resumed duruma geçebilir.
Activtiy’nizin karmaşıklığına bağlı olarak, tüm bu yaşam
döngüsü metotlarını uygulamanız gerekmemektedir. Fakat bu metotların her
birinin çalışmasını anlamalı ve kullanıcı beklentisine göre bunları nasıl
uygulayacağınızı öğrenmenizde fayda vardır. Bu metotları uygulamanıza dahil
ettiğinizde aşağıda sıralanan birkaç yönden uygulamanızın daha iyi çalışmasını
sağlayacaktır. Bunlar,
·
Kullanıcı uygulamanızı kullanırken telefon
geldiğinde veya farklı bir uygulamaya geçerken uygulamanız yok edilmeyecektir,
·
Kullanıcı uygulamanızı aktif bir biçimde
kullanmadığında sistemin değerli kaynaklarının boşa tüketilmesini önlersiniz,
·
Kullanıcının uygulamanızdan çıkıp bir süre sonra
geri döndüğünde, yapmış olduğu ilerlemeleri kaybetmesinin önüne geçmiş
olursunuz,
·
Kullanıcı cihazı Yatay(LandScape) veya Dikey
(Portrait) durumda kullandığında aynı şekilde uygulamanın yok edilmesinin önüne
geçersiniz. (Yatay ve dikey kullanım arası geçişlerde sistem uygulamaların yeni
bir örneğini çalıştırır.)
Takip eden derslerde yukarıdaki şekilde görülen activity’nin
farklı durumlar arasındaki geçişlerin ne anlama geldiğini daha detaylı
öğreneceğiz. Fakat bu durumlardan 3 tanesi sabittir. Bunlar, activity’nin üç
durumdan sadece birinde bulunabileceğini gösterir.
Resumed
Bu durumda, activity ekrandadır ve kullanıcının etkileşimine
açıktır.( Bazen çalışır(running state) durum olarak da tanımlanır.)
Paused
Bu durumda, activity kısmen farklı bir uygulama tarafından
arka plana itilir. ( Bu durum, diğer activity’nin transparan bir şekilde önde
veya ekranın bir kısmında yer aldığı durumları ifade eder.Yani aktif uygulama
ekranı tam kaplamaz) Paused(duraklatılmış) activity kullanıcı ile etkileşimde
değildir ve kullanıcıdan herhangi bir giriş almaz, herhangi bir kod yürütmez.
Stopped
Bu durumda, activity tamamen arka plana itilmiş veya
kullanıcı tarafından hiçbir şekilde görünmemektedir. Bu durum uygulamanızın
arka planda kaldığı şeklinde düşünülebilir. Stopped state (durdurulmuş durum)
‘de activity örneği ve bunun üye değişkenler (member variables) gibi tüm durum bilgileri korunur ancak
herhangi bir kod çalıştırılmaz.
Diğer durumlar olan ( Created ve Started) oluşturma ve
başlatma durumlar çok hızlı bir geçiş noktasıdır ve sistem hızlı bir şekilde
piramitte bir sonraki basamak olan yaşam döngüsü metoduna geçer. Bu işlem,
sistemin onCreate() metodunu çağırmasıyla
hızlıca başlar ve onStart() metodu
çağırıldıktan hemen sonra onResume()
metoduna geçilmesi şeklinde gerçekleşir.
Buraya
kadar bahsettiklerimiz, activity yaşam döngüsünün temellerine işaret eder.
Şimdi belirli yaşam döngüsü davranışlarını inceleme zamanı…
Uygulamanızı Launcher Activity Olarak Tanımlama
Kullanıcı
ana ekranda uygulamanızın ikonuna tıkladığı anda, sistem “Launcher” (veya main)
olarak tanımlanan activity’nin onCreate()
metodunu çağırır. Bu activity’nizde tanımladığınız ve kullanıcıyı
karşıladığınız giriş noktanızdır.
Projenizin
kök dizininide yer alan AndroidManifest.xml dosyanız yardımıyla hangi
activity’nin başlangıç için kullanılacağına kolay bir şekilde karar verebilirsiniz.
Başlangıç
için belirleyeceğiniz activity için manifesto dosyanızda <intent-filter>
tagi içinde MAIN action ve LAUNCHER kategorileri belirtilmiş bir şekilde
tanımlama yapmanız gerekmektedir.
ÖRNEK:
<activity android:name=".MainActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
NOT:
Android SDK Tools ile yeni bir proje oluşturduğunuzda, Activity
classlarını da içeren proje dosyalarında varsayılan olarak tanımlı gelir.
Eğer, MAIN action veya LAUNCHER kategorilerden birini
tanımlamazsanız, uygulamanıza ait icon ana ekranda görünmez.
Yeni Bir Örnek Oluşturmak
Birçok
uygulama kullanıcının farklı işlemler yapmasına olanak sağlayacak olan birkaç
farklı activity sağlar. Bunlar uygulama ikonunuza tıklandığı anda LAUNCHER
olarak tanımlanan activity veya kullanıcının etkileşimlerine verilen cevaplar
sonrasında oluşturulan activityler olabilir. Tüm bu activity’lerin her biri
için sistem onCreate() metodu çağırarak bu
yeni örnekleri oluşturur.
Activity’nizin
tüm yaşam döngüsü boyunca gerekli olabilecek temel kodları ve yalnızca bir kere
çalıştırmanız gereken bazı kodları bu metot içerisinde derlemeniz
gerekmektedir. Örneğin, onCreate() metodunu
uyguladığınızda, kullanıcı ara yüzünü (User Interface) ve değişik ölçeklerde
erişime sahip değişkenlerinizi burada tanımlamanız gerekir.
Aşağıdaki
örnekte activity için gerekli olan kullanıcı ara yüzünü hazırlama, üye değişken
tanımlama ve User Interface’de bazı temel düzenlemeleri yapmanız için gereken
kodlar gösterilmektedir.
ÖRNEK:
TextView mTextView; // Member variable for text view in the layout @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Set the user interface layout for this Activity // The layout file is defined in the project res/layout/main_activity.xml file setContentView(R.layout.main_activity); // Initialize member TextView so we can manipulate it later mTextView = (TextView) findViewById(R.id.text_message); // Make sure we're running on Honeycomb or higher to use ActionBar APIs if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { // For the main activity, make sure the app icon in the action bar // does not behave as a button ActionBar actionBar = getActionBar(); actionBar.setHomeButtonEnabled(false); } }
UYARI:
SDK_INT kullanımıyla eski
sistemlerde yeni API’lerin kullanımının önüne geçilmesi hedeflenmiştir.
Yukarıdaki kod bloğunda kullanılan IF döngüsü ile bu durum sağlanıyor ve eski
sürümlerde döngü içindeki kodlar icra edilmez.
onCreate() metodu çalışmasını bitirdiği anda
sistem onStart() metodunu çağırır ve ardından
onResume() metoduna hızlı bir geçiş
gerçekleştirilir. Activity’niz asla onStart()
veya onCreate() metotlarında kalmaz. Teknik
olarak, onStart() metodu çağırıldığında
activtiy’niz görünür hale gelir. Bu metodu onResume()
metodu hızlı bir şekilde takip eder ve uygulamayı Resumed duruma geçirir ve
activity bu durumu değiştirecek bir durum meydana gelene kadar (Örneğin; farklı
bir activitye geçildiğinde, çağrı geldiğinde veya ekran kapandığında ) bu
metotta çalışmasını sürdürür.
Takip
eden bir sonraki bölümde, activity yaşam döngüsü içerisinde kullanışlı olan ve
kullanıcının Paused veya Stopped durumlardan activity’e devam ederken
faydalandığımız diğer başlatma metotları olan onStart()
ve onResume() metotlarının ne olduğunu
göreceğiz.
NOT:
onCreate() metodu savedInstanceState parametresini
içermektedir. Bu parametrenin ne anlama geldiğini daha sonra Recreating
an Activity bölümünde inceleyeceğiz.
Android sistemin yeni bir activity örneği başlatırken
kullanılan 3 temel callback metodunun vurgulandığı gösterim. Bunlar onCreate(), onStart() ve onResume() metotlarıdır.
Bu metot dizisi tamamlandığında, activity Resumed durumuna erişir ve farklı bir
activity’e geçene kadar etkileşimde kalır.
Activity Sonlandırmak
Activity,
yaşam döngüsünün ilk metodu onCreate() iken
son metodu da onDestroy() metodudur. Sistem
tarafından activity’nizden sistem belleğinden tamamen silindiğine dair bir
işaret aldığı anda çağırılır.
Birçok
uygulama bu metodun uygulanmasına ihtiyaç duymamaktadır. Çünkü yerel sınıf
referansları activity ile birlikte yok edilir ve activity’niz birçok temizlik
işlemini onPause() veye onStop() metodunda gerçekleştirir. Ancak
uygulamanızı onCreate() başlatırken aynı zamanda uzun zamanlı çalışacak olan
işlemler dizisini de başlattıysanız, bu işlemler sistem kaynakları için
potansiyel tehdit olacaktır. Bu nedenle onDestroy()
metodu ile bu işlemleri durdurmanız sistem kaynakları açısından çok verimli bir
işlem olacaktır.
ÖRNEK:
@Override public void onDestroy() { super.onDestroy(); // Always call the superclass // Stop method tracing that the activity started during onCreate() android.os.Debug.stopMethodTracing(); }
NOT:
Sistem onPause() ve onStopped() metotlarının sonrasında bir durum
hariç her zaman onDestroy() metodunu
çağırır. Bu, onCreate() metodundan finish() metodunu çağırdığınız durumdur. Bazı
durumlarda, örneğin activityniz farklı bir activity başlatmada geçici karar
mekanizması olarak çalıştığında, activity yok etmek için finish() metodunu onCreate()
içinden çağırmalısınız. Bu durumda, sistem diğer hiçbir yaşam döngüsü sürecini
işleme almadan anında onDestroy() metodunu
çağırır.