Translate

3 Temmuz 2013 Çarşamba

Starting an Activity - Bir Activity Başlatma

Uygulamaların main metodu ile başlatıldığı diğer programlamara benzemeyen Android sistemi kodu yaşam döngüsü (lifecycle) aşamalarına karşılık olan özel geri çağrı(callback) metodlarının yürütülmesi sayesinde Activity örneği ile başlar. Bir Activity'yi başlatırken ve bitirirken kullanılan bir dizi callback metodu bulunmaktadır.

Understand The Lifescycle Callbacks - Yaşam Döngüsü Geri Çağrılarını Anlama

Bir Activity'nin yaşam döngüsü boyunca, sistem bir piramide benzeyen bir dizi yaşam döngüsü metodu çağırır. Diğer bir deyişle, activity yaşam döngüsünün her aşamasında piramit üzerinde ayrı bir adıma sahiptir. Sistem yeni bir Activity örneği oluşturduğunda, her callback metodu activity durumunu bir adım yukarı doğru taşır. Piramidin tepesi activity'nin en önde çalıştığı ve kullanıcının onunla meşgul olduğu noktadır.

Kullanıcı Activity'den ayrılmaya başladığında, sistem  activity'yi bitirmek için tekrardan piramidin altına taşıyacak olan diğer metodları çağırır. Bazı durumlarda, activity kısmen taşınacak ve bekleyecektir (örneğin kullanıcı başka bir uygulamaya geçtiğinde), activity bu noktadan tekrar üste gelebilir ve kullanıcı kaldığı yerden devam edebilir.
Şekil 1 - Activity yaşam döngüsünün basit bir görünümü piramit yapısı ile ifade edilmiştir. Bu şekil bir activity'nin duraklatıldığında ve tekrar devam ettirildiğinde veya bitirilip tekrardan başlatıldığında nasıl bir yaşam döngüsüne girdiğini gösteriyor.
Aslında yazdığınız uygulamanın ne kadar karışık olduğuna bağlı olarak bütün yaşam döngüsü metodlarını implement etmenize gerek olmayacaktır. Ancak, Her bir metodu anlamanız ve uygulamanızın kullanıcıların tam olarak beklediği biçimde çalışacağından emin olarak implement edebilmeniz çok önemlidir.

Activity için yaşam döngüsü metodlarını implement etme muhtemelen bir çok yönden uygulamanızın iyi bir davranış sergilemesini kesinleştirecektir. Bunları şöyle sıralayabiliriz:
  • Kullanıcı uygulamanızı kullanırken bir telefon araması aldığında veya başka bir uygulamaya geçtiğinde uygulamanız çökmez.
  • Kullanıcı uygulamanızı kullanmayı bıraktığında uygulama sistem kaynaklarını tüketmeye devam etmez.
  • Kullanıcı uygulamanızı bırakıp bir süre sonra tekrar uygulamanıza devam ettiğinde yaptığı işlemleri kaybetmez.
  • Ekran yönü değiştiğinde kullanıcı uygulamanızda yaptığı değişiklikleri kaybetmez veya uygulamanız çökmez.
Şekil 1 de gösterilen farklı durumlar arasındaki activity geçişlerinde bir çok durum vardır. Ancaki bu durumlardan 3 tanesi statik olabilir. Yani activity aynı zamanda sadece bu üç durumdan birinde bulunabilir:

Devam Eden (Resumed)
  • Bu durumda activity en öndedir ve kullanıcı onunla meşguldür. 
Duraklatılmış (Paused)
  • Bu durumda activity başka bir activity tarafından gizlenmiştir - Önde olan diğer activity yarı saydamdır veya bütün ekranı kaplamaz. Duraklatılmış aktivity herhangi bir kullanıcı girişi almaz veya herhangi bir kod çalıştıramaz
Durdurulmuş (Stopped)
  • Bu durumda activity tamamen saklanmıştır ve kullanıcıya görünmez. Arka planda tutulur. Activity durdurulmuşken, activity instansları ve üye değişkenler gibi activity'ye ait olan tüm durum bilgileri tutulur. Fakat activity her hangi bir kod yürütemez.
Diğer durumlar (Oluşturma ve Başlatma) geçicidir ve sistem bu durumlardan çok çabuk yaşam döngüsü geri çağrı (lifecycle callback) metodunu çağırarak diğer durumlara geçer. Yani, onCreate() sistem çağrısından sonra, hemen onStart() çağrılır ve onResume() ile devam edilir.

Bu anlatılanlar bir activity'nin temel yaşam döngüsüdür. Şimdi bazı özel yaam döngüsü davranışlarını inceleyelim.

Specify Your App's Launcher Activity - Uygulamanın Başlatma Activity'sini Belirleme

Kullanıcı ana ekrandan uygulamanın ikonunu seçtiğinde, launcher (veya main) activity olarak belirlediğiniz Activity için onCreate() metodunu çağırır. Bu activity kullanıcı arayüzünün ana giriş noktası olarak hizmet eder.

Android manifest dosyasında hangi activity'yi ana giriş ekranı olarak tanımlamak istediğinizi belirleyebilirsiniz. AndroidManifest.xml dosyası projenin köküdür. 

Uygulamanızda bulunan ana activity  manifest dosyasında LAUNCHER kategorisini ve MAIN action'ını içeren <intent-filter> ile birlikte bildirilmelidir.

Örneğin:


<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>
Not: SDK araçları ile yeni bir android projesi oluşturduğunuzda, varsayılan proje dosyaları filtreli bir manifest içinde bildirilmiş bir Activity sınıfını zaten içerir. 

Activity'lerinizden herhangi biri için MAIN action veya LAUNCHER kategorisi bildirilmediğinde, uygulama ikonu ana ekranda belirmez.

Create a New Instance - Yeni Bir Instans Oluşturmak

Çoğu uygulama kullanıcının farklı action'ları başlatabilmesine olanak veren bir çok activity içerir. Bir activity kullanıcı uygulama ikonuna tıkladığında yaratılan main activity veya kullanıcının bir action'ınına cevap olarak oluşturulmuş olan farklı bir activity olsun, sistem onCreate() metodunu çağırarak yeni bir Activity instansı oluşturur.

Activity'nin bütün yaşamı boyunca bir kez olması gereken tamel uygulama başlangıç mantığının gerçekleştirilmesi için onCreate() metodu implement edilmelidir. Örneğin, onCreate() metod immplementasyonu kullanıcı arayüzünü ve mümkün olan bütün sınıf kapsamlı değişkenleri tanımlamalıdır.

Mesela, aşağıda verilen onCreate() metodu örneği kullanıcı arayüzü (XML Layout dosyasında belirlenen), tanımlanan üye değişkenler ve kullanıcı arayüzü konfigürasyonları gibi activity için kullanılan temel ayarları gerçekleştirir. 

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);
    }
}
onCreate() çalışmasını sonlandırdığında, sistem arkası arkasına hemen onStart() ve onResume() metodlarını çağırır. Activity asla, oluşturulmuş(Created) veya başlatılmış(Started) durumunda kalmaz. Teknik olarak onStart() çağrıldığında activity kullanıcıya görünür olur, fakat ardından onResume() hemen başlar ve kullanıcıyı yönlendiren veya ekranı kapatan telefon çağrısı gibi durumu değiştiren bir olay meydana gelinceye kadar activity Resume durumunda kalır.

Şekil 2 -  Activity yaşam süreci ile ilgili yeni bir activity instansı oluşturulduğunda sistem tarafından sırasıyla çağrılan  3 ana call-back metoduna ait başka bir gösterim: onCreate(), onStart(), ve onResume(). Bu işlem sırası tamamlandığında, kullanıcı başka bir activity'ye geçinceye kadar mevcut activity onResume() durumunda kalır.

Destroy the Activity - Activity'yi Yok Etme

Activity birinci yaşam sürecinde yani onCreate() durumunda iken, onun en son callbak'i onDestroy() durumudur. Sistem, activity instansı sistem belleğinden tamamen kaldırılıp bitiş sinyali activity tarafından gönderildiğinde bu metod çağrılır.

Çoğu uygulama bu metodu implement etmeye gerek duymaz çünkü yerel sınıf referansları activity ile birlikte yokedilir ve onPause() ve onStop() durumunda en fazla temizliği yapmalıdır. Ancak, activity arksında oluşturma esnasında başlatılmış geri plan thread'leri varsa bunlar onDestroy() durumunda sonlandırılmalıdır.

@Override
public void onDestroy() {
    super.onDestroy();  // Always call the superclass
    
    // Stop method tracing that the activity started during onCreate()
    android.os.Debug.stopMethodTracing();
}
Not: Sadece bir durum haricinde sistem onPause() ve onStop() çağrıldıktan sonra onDestroy()'u çağırır. Bu durum onCreate() ile finish()'i çağırmanızdır. Başka bir activity'yi çalıştırmak için activity karar verici gibi davrandığı bazı durumlarda,  activity'yi bitirmek için onCreate() içinden finish() metodunu çağırabilirsiniz. Bu durumda, sistem doğruca diğer yaşam döngüsü metodlarını çağırmadan onDestroy() metodunu çağırır.

Hiç yorum yok:

Yorum Gönder