Translate

9 Temmuz 2013 Salı

Stopping and Restarting an Activity - Bir Activity'yi Durdurma ve Yeniden Başlatma

Activity'yi düzgün olarak durdurup başlatabilmek, activity'nin yaşam döngüsü içinde kullanıcıların uygulamanın canlı olduğunu ve işlemleri sorunsuz bir şekilde yapabileceğıni algılamalarını sağlayan çok önemli bir işlemdir. Aslında uygulamayı durdurup başlatırken gerçekleşen sadece bir kaç senaryo vardır:

  • Kullanıcı halihazırda kullanılan uygulamalar penceresini açar ve başka bir uygulamadan sizin uygulamanıza geçebilir. Uygulamanızda o anda aktif olan activity durdurulur. Eğer kullanıcı ana ekrandaki uygulamanın simgesine tıklarsa veya tekrardan halihazırda kullanılan uygulamalar (recent apps) penceresinden uygulamanıza tekrar gelirse activity tekrar başlar.
  • Uygulamada yeni activity başlatan bir action kullanıcı tarafından oluşturulur.İkinci activity oluşturulduğunda o anki activity durdurulur. Eğer kullanıcı geri (back) butonuna basarsa birinci activity tekrar başlar.
  • Kullanıcı uygulamanızı telefonunda kullanırken bir arama alır.
Activity sınıfı iki tane yaşam döngüsü metodu sağlar. Bunlar onStop() ve onRestart() metodlarıdur. Bu metodlar özellikle activity'nin durduğunda ve geri başladığında neler yapacağını işler.Kısmen kullanıcı arayüzünü tıkayan Pause metodunun aksine, Stop durumu kullanıcı arayüzünün artık görünür olduğunu ve kullanıcı odağının ayrı bir activity'de olduğunu garanti eder.

Not: Sistem Activity durdurulduğunda activity instansını sistem belleğinde bıraktığı için, onStop() ve onResume() (hatta onStart()) metodlarını imlplement etmemeniz mümkün.  Nispeten basit olan çoğu activity için activity iyi olarak duracak ve tekrar başlayacaktır. Devam eden uygulamaları duraklatmak için ve sistem kaynaklarından (kamera, hoparlör gibi) kopmak için sadece onPause() metoduna ihtiyaç duyulabilir.
Şekil 1 - Kullanıcı activity'yi terk ettiğinde, sistem activity'yi durdurmak için onStop() 1  metodunu çağırır. Activity  durdurulduğunda kullanıcı activity'ye geri dönerse, sistem onRestart() 2 metodunu çağırır, ardından hızlıca onStart() 3 ve onResume() 4 metodları çağrılır. Dikkat edilmesi gereken nokta onStop() metodu çağrıkmadan önce activity'nin hangi senaryo ile durdurulduğunun bir öneminin olmadığıdır.

Stop Your Activity - Activity'yi Durdurma

Activity onStop() metoduna bir çağrı aldığında, artık görünür değildir ve kullanıcının kullanmadığı ve ihtiyaç duyulmayan bütün kaynakları serbest bırakmalıdır. Activity durdurulduktan sonra, sistem eğer sistem belleğine ihtiyaç duyarsa activity'nin instansını imha edebilir. Sıra dışı durumlarda, sistem uygulama işlemlerinizi activity'nin finali olan onDestroy() callback metodunu çağırmadan bitirebilir. Bu yüzden belleği dolduran kaynakları serbest bırakmak için onStop() metodunu kullanmak önemlidir. 

onStop() metodundan önce onPause() metodu çağrılmasına rağmen, onStop() metodunu veri tabanına bilgi girme işlemleri gibi daha fazla, daha geni CPU - Yoğun işlemleri kapatmayı gerçekleştirmek için kullanmalısınız.

Örneğin aşağıda kalıcı bir hafızaya bir taslak içeriğini kaydeden bir onStop() metodu implemantasyonu görülmektedir: 


@Override
protected void onStop() {
    super.onStop();  // Always call the superclass method first

    // Save the note's current draft, because the activity is stopping
    // and we want to be sure the current note progress isn't lost.
    ContentValues values = new ContentValues();
    values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
    values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());

    getContentResolver().update(
            mUri,    // The URI for the note to update.
            values,  // The map of column names and new values to apply to them.
            null,    // No SELECT criteria are used.
            null     // No WHERE columns are used.
            );
}
Activity durduğunda, Activity nesnesi bellekte yerleşik olarak korunur ve activity devam ettirildiğinde tekrar çağrılır. Resume durumuna çıkana kadar herhangi bir callback metodu sırasında oluşturulan bileşenleri tekrar başlatmanıza gerek kalmaz. Sistem aynı zamanda layout'daki görünüm için o anki duruma giden yolu saklar, böylece kullanıcı bir Edittext bileşenine bir metin girmişse, bu içerik tutulur bu şekilde kaydetmeye veya tekrar aynı metni girmeye ihtiyaç olmaz.

Not: Activity durduğunda sistem activity'yi imha etse bile, View nesnelerinin durumları sistem tarafından bir Bundle (bohça) içinde korunur(bir EditText içinde bulunan metin gibi) ve activity'nin aynı instansına geri dönüldüğünde tekrardan bunlar işlenir. 

Start/Restart Your Activity - Activity'yi Başlatma/Yeniden Başlatma

Activity durma halinden tekrardan öne çıktığında, onRestart() çağrısı alır. Activity her görünür olduğunda (veya oluşturulduğunda, yeniden başlatıldığında) sistem aynı zamanda onStart() metodunu çağırır. onRestart() metodu ancak sadece activity durdurulmuş halden devam haline geçerken çağrılır, böylece activity durdurulmuş ama imha edilmemiş bir haldeyken gerekli olabilecek özel restorasyon işlemlerini gerçekleştirmek için kullanılabilir.

onRestart() metodu ile bir uygulamanın activity durumunu restore etmesi çok nadirdir bu yüzden bu metod için çoğu uygulama ile kullanılması gereken genel bir kural yoktur. Ancak, onStop() metodunun tüm activity kaynaklarını temizlemesi gerektiğinden, activity tekrar başladığında bu kaynaklar tekrardan başlatılır. Buna rağmen, activity ilk kez oluşturulduğunda yine de bu kaynakları başlatmaya ihtiyaç duyulur. Bu yüzden genelde onStart() metodu onStop() metoduna karşılık şekilde kullanılır. Çünkü sistem hem uygulamanızı oluşturduğunda hem de durmuş halindeyken tekrar başlattığında onStart() metodunu çağırır.

Örneğin, bir kullanıcı uygulamanın başından çok uzun bir süre ayrılmış ve sonra tekrar geri gelmiş olsun, böyle bir durumda onStart() metodu gerekli sistem bilşenlerinin başlatılması için doğru yer olacaktır.


@Override
protected void onStart() {
    super.onStart();  // Always call the superclass method first
    
    // The activity is either being restarted or started for the first time
    // so this is where we should make sure that GPS is enabled
    LocationManager locationManager = 
            (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    
    if (!gpsEnabled) {
        // Create a dialog here that requests the user to enable GPS, and use an intent
        // with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action
        // to take the user to the Settings screen to enable GPS when they click "OK"
    }
}
@Override
protected void onRestart() {
    super.onRestart();  // Always call the superclass method first
    
    // Activity being restarted from stopped state    
}
Sistem activity'nizi yok ettiğinde, activity'niz için onDestroy() metodunu çağırır. Çünkü genelde sistem kaynaklarını onStop() metodu ile serbest bırakırsınız, onDestroy() metoduna bir çağrı yapıldığında uygulamanın ihtiyaç duyacağı çok fazla şey yoktur. Bu metod belleğin temizlenmesi için kullanıcının son şansıdır. Bu yüzden burada hala çalışan thread'lerin sonlandığından ve her şeyin durdurulduğundan emin olmalısınız.

Hiç yorum yok:

Yorum Gönder