JavaveAndroidHakkında

Android Yazılım geliştirme konusunda sürekli bilgi akışı sağlayan, soru-cevaplar ile öğrenme gerçekleştirmeyi amaçlayan bir eğitim süreci planlıyoruz.

durdurmak etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
durdurmak etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

14 Mart 2015 Cumartesi

Android-ActivityLifeCycleYönetimi-BirActivityYenidenOluşturmak

23:50

Bir Activitynin Yeniden Oluşturulması



                Normal kullanım sırasında activity’nizin yok edilmesi durumu ile ilgili, kullanıcı Back butonuna basarak geri dönmesi veya activity kendi içinde finish() metoduyla destroy işareti alması gibi birkaç senaryo mevcuttur. Ayrıca sistem kullanıcının uygulamanızdan uzun bir süre boyunca ayrılması durumunda veya diğer bir uygulamanın daha fazla sistem kaynağına ihtiyaç duyması halinde arka planda kalan uygulamaların kapatılması gerektiğinde bu işlemi kendiliğinden yapabilir.
                Yukarıdaki sebeplerden hangisi ile olursa olsun, activity örneğinin yok edilmesi sistem tarafından Activity örneğine daha fazla ihtiyaç duyulmadığının anlaşılmasıyla gerçekleşir. Ancak, sistem kısıtlamaları nedeniyle bir activity örneği yok edildiğinde, gerçek activity örneği yok olsa bile kullanıcı bu uygulamaya geri döndüğünde, bu activity yok edildiğinde son duruma ait kayıtlı verilerin de yardımıyla sistem yeni bir örnek oluşturarak bu activityi hatırlayabilir. Kayıtlı veri dediğim bu veriler, “instance state” dediğimiz bir önceki activity durumunu yeniden oluşturmak için sistem tarafından kullanılır ve bu veriler Bundle nesnesinde saklanan anahtar-değer çiftleri seti ( collection of key-value pairs) olarak bilinir.

UYARI:
                Activity’niz kullanıcını cihazı yatay veya dikey olarak her yönlendirmesinde yok edilip yeniden oluşturulur. Ekran yönlendirmesi her değiştiğinde, sistem her yönlendirme için ihtiyaç duyulan farklı ara yüz kaynaklarını yüklemek için bu işlemi gerçekleştirir.
Varsayılan olarak, Activity layout tasarımında yer alan her bir View öğesi için sistem Bundle kullanarak son durumları saklamaktadır. (Örneğin, EditText nesnesine girilen text değerinin otomatik olarak saklanması). Bu sayede, ekran yönlendirmesi her değiştiğinde hali hazırda girilmiş olunan veya mevcut durum bilgilerini kaydetmek için ayrıca bir kod yazmanıza gerek kalmaması sağlanmış olur. Ancak, activity’niz kaydetmek isteyebileceğiniz kullanıcının yapmış olduğu son işlemleri takip edebilmenize yarayacak bilgiler gibi çok daha fazla durum bilgisi içeriyor olabilir. Bunlar için SharedPreferences konularında anlattığımız yetenekleri kullanmanız gerekecektir.

NOT:
Android sistem tarafından view öğelerinize ait durumların yeniden yüklenmesi durumunda her bir view android:id niteliği ile tanımlanmış benzersiz bir id’ye sahip olması gerekir.

Activity durumu ile ilgili olarak ek veriler kaydetmek için, onSaveInstanceState() metodunu Override etmelisiniz. Sistem bu metodu çağırarak, kullanıcının uygulamanızı (activitynizi) terk ettiği anda bu verileri Bundle nesnelerine geçirir ve beklenmedik sonlanmalar meydana gelmesi ihtimaline karşın son durumların kaydedilmesini sağlar. Eğer sistem activity örneğini daha sonra yeniden oluşturursa, bu veriler aynı Bundle nesnelerinden olan onRestoreInstanceState() ve onCreate() metotlarının her ikisine de geçirilir.




                Sistem activitynizi durduracağı zaman onSaveInstanceState() metodunu çağırır (1). Burada activitynizin daha sonra yeniden başlatılırken ihtiyaç duyacağı durum bilgilerini kaydedersiniz. Sistem (1) de tanımlanan durum bilgilerini hem onCreate() metoduna hem de onRestoreInstanceState() metoduna geçirir.(3)

Activitynizin Durumunu Kaydetme


                Activityniz durdurulacağı zaman, sistem onSaveInstanceState() metodunu çağırır ve activityniz son durum bilgisini anahtar-değer çiftleri setine kaydeder. Bu metodun varsayılan uygulamasında View hiyerarşisine göre activitynin durumu hakkındaki bilgiler kaydedilir. (Örneğin, EditText içindeki bir text değeri veya ListView içindeki scroll konumu gibi)
                Activitynize ait fazladan durum bilgisi kaydetmek için, onSaveInstanceState() metodunu uygulamalı ve anahtar-değer çiftlerini Bundle nesnelerine eklemelisiniz.

ÖRNEK:

static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
   
// Save the user's current game state
    savedInstanceState
.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState
.putInt(STATE_LEVEL, mCurrentLevel);
   
   
// Always call the superclass so it can save the view hierarchy state
   
super.onSaveInstanceState(savedInstanceState);
}

UYARI:
Her zaman onSaveInstanceState() metodunu superclass olarak uygulamalısınız böylece varsayılan uygulama ile view hiyerarşi durumunu kaydedebilirsiniz.

 

Activity Durumunu Yeniden Yüklemek


                Daha önce yok edilen activityniz yeniden oluşturulurken, sistem tarafından activitynizden Bundle nesnelerine geçirilen bilgiler dahilinde kayıtlı son durumu yeniden çağırabilirsiniz. onCreate() ve onRestoreInstanceState() metotlarının her ikisi de aynı Bundle kaynağından bu durum bilgilerini çeker.
                Bunun nedeni, activityniz ilk defa oluşturulurken veya daha önce yok edilen bir örnek yeniden oluşturulurken onCreate() metodu sistem tarafından çağırılmasıdır. Bundle nesnelerini okumaya çalışmadan evvel mutlaka bu nesnelerin boş mu? Dolu mu? olduklarını kontrol etmeniz gerekir. Eğer boş ise, sistem yok edilmiş bir örnek oluşturmak yerine activitynin yeni bir örneğini oluşturur.
onCreate() metoduyla bazı durum verilerini nasıl yeniden yüklendiğini inceleyelim.
ÖRNEK:

@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState); // Always call the superclass first

   

    // Check whether we're recreating a previously destroyed instance

    if (savedInstanceState != null) {

        // Restore value of members from saved state

        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);

        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);

    } else {

        // Probably initialize members with default values for a new instance

    }

    ...

}

onCreate() metodu yerine sistem tarafından onStart () metodunun hemen ardından çağırılacak olan onRestoreInstanceState() metoduyla yeniden yükleme işlemi yapmak isterseniz, Bundle nesnelerini kontrol etmenize gerek kalmaz.

ÖRNEK:

public void onRestoreInstanceState(Bundle savedInstanceState) {

    // Always call the superclass so it can restore the view hierarchy

    super.onRestoreInstanceState(savedInstanceState);

   

    // Restore state members from saved instance

    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);

    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);

}

UYARI:
Her zaman onRestoreInstanceState() metodunu superclass olarak uygulamalısınız böylece varsayılan uygulama ile view hiyerarşi durumunu kolaylıkla yeniden oluşturabilirsiniz.


Soru ve Görüşleriniz için: AndroidVeJava

Android-ActivityLifeCycleYönetimi-BirActivityDurdurmakVeYenidenBaşlatmak

23:47

Bir Activity Durdurmak ve Yeniden Başlatmak


                Düzenli bir durdurma ve yeniden başlatma işlemi kullanıcın activity’nize geri döndüğünde sürekli aktif ve kullanıcı bilgilerinin korunması için önemli bir işlem sürecidir. Activity’nizin durdurulup yeniden başlatılmaya ihtiyaç duyacağı birkaç senaryodan bazıları aşağıdaki gibi olabilir.
·         Kullanıcı Recent Apps( son kullanılan Uygulamalar) menüsünü açıp farklı uygulamalara geçiş yapabilir. Bu durumda uygulamanızın ekranda bulunan activity örneği durdurulur. Kullanıcı ana ekranda yer alan bulunan uygulama ikonunuza dokunduğunda veya Recent Apps penceresinden geri geldiğinde activity yeniden başlatılır.
·         Kullanıcı uygulamanız içinden yeni bir activity başlatacak bir işlem gerçekleştirdiğinde mevcut activity durdurulur ve diğer activity başlatılır. Kullanıcı back butonun bastığında ilk activity tekrar başlatılır.
·         Kullanıcı uygulamanızı kullandığı anda bir çağrı alınca…

Activity sınıfı, uygulamanızın durdurulması ve yeniden başlatılması gibi durumlarda uygulamanızın nasıl davranacağına karar vermek için onStop() ve onRestart() gibi iki yaşam döngüsü metodu tanımlar. Paused durumdan farklı olarak, (kısmen UI arka plana itildiği durum olarak tanımlanan) stopped durum UI nin tamamen arka plana atılmasını ve hiçbir şekilde görünmemesini garanti ederek activity den kullanıcının dikkatini tamamen keser.

NOT:
Sistem Activityniz stopped duruma geçtiğinde bu activitynin bir örneğini bellekte sakladığı için, onStop() veya onRestart() metodunu uygulamanıza gerek kalmaz. Hatta onStart() metodunu bile uygulamanız gerekmeyebilir. Birçok activity nispeten basittirler ve çok rahat bir şekilde durdurulup başlatılabilirler ve size sadece süregelen işlemleri durdurmak için onPause() metodunu kullanmak kalır.



     Kullanıcı activity’nizden ayrıldığında, sistem onStop() metodunu çağırarak activity i durdurur(1). Activity durdurulduğunda kullanıcı geri gelirse, sistem onRestart()(2) metodunu çağırır ve bunu hızlıca onStart()(3) ve onResume()(4) metodu takip eder. Dikkat etmeniz gereken asıl konu ise ne türlü bir senaryo gerçekleşecek olursa olsun, sistem onStop() metodundan evvel onPause() metodunu çağırır.

Activity Durdurmak


                Activity’niz onStop() metodunu çağırdığında, bu demek oluyor ki artık bu activity daha fazla görünmeyecek ve kullanıcının ihtiyaç duymadığı ne kadar kaynak var ise serbest bırakılacak demektir. Activity’niz durdurulduğunda, sistem kaynağına ihtiyaç var ise bu activity örneği yok edilecektir. Diğer bellek gerektiren ekstra durumlarda, sistem uygulamanızı onDestroy() metodunu çağırmaya ihtiyaç duymadan sonlandırabilir. Bu nedenle onStop() metodunu kullanmanızdaki en büyük fayda sistemin bu yola başvurmadan evvel sizin sistem kaynaklarını serbest bırakmanızdır.
                onPause() metodu onStop() metodundan evvel çağırılmasına rağmen, aşırı sistem kaynağını tüketen işlemleri sonlandırmak için onStop() metodunu kullanmanız her zaman daha verimli bir işlem olacaktır.

                Aşağıdaki örnekte, onStop() metodunun bir uygulaması görülmektedir. Bu uygulama ile geçici belleği not defterinde tutulan kayıtların kaydedilme işlemi icra ediliyor.

ÖRNEK:
@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’niz durdurulduğunda, Activity nesnesi bellekte bir yer tutar ve yeniden çağırıldığında activity devam eder. Bu süreç içerisinde uygulamanızın bileşenlerini yeniden hazırlamanız gerekmemektedir. Sistem ayrıca mevcut duruma ait her bir View’in izini de saklar. Böylece kullanıcı EditText öğesine bir veri girişi yaptığında bu otomatik olarak, sizin herhangi bir saklama prosedürü uygulamanıza gerek kalmadan saklanır.

NOT:
Stopped durumda sistem activity’nizin yok etse bile, bu activitye ait View nesnelerinin durumlarını Bundle içerisinde korur ve kullanıcı aynı activity örneğine geri döndüğünde UI nin son haliyle uygulama çalışmaya devam eder. ( Bir sonraki konuda Bundle hakkında daha detaylı bilgi aktaracağız)

Bir Activity’nin Başlatılması/Yeniden Başlatılması


                Activityniz Stopped durumdan tekrar ön plana geldiğinde, onRestart() metoduna geçer. Ayrıca sistem, activityniz her ön plana geldiğinde olduğu gibi onStart() metodunu da çağırır. onRestart() metodu sadece activity stopped durumdan devam ederken çağırılır. Böylece öncelikle stopped duruma geçen uygulamanız için bazı özel restorasyonları gerçekleştirme imkânı elde etmiş olursunuz.
                Uygulamanın activity durumunu onRestart() metodu ile restore etmesi aslında çok yaygın bir kullanım değildir. Çünkü genel uygulama dünyasında bu tarz bir yönetime pek ihtiyaç duyulmamaktadır. onStop() metodu activitynizin kullandığı tüm kaynakları temizlemek için uygulanmalıdır. Ancak bu işlem sonrası Activity yeniden çağırıldığında durdurduğunuz tüm işlemleri yeniden hazırlamanız gerekecektir. Bunun yanında Activity’niz yeniden oluşturulduğu durumlarda da bu hazırlıkları yapmanız gerekcektir.( hiçbir şekilde activity örneğinizin olmadığı durum). Bu nedenle, onStop() metoduna karşılık olarak her zaman onStart() metodunu kullanmalısınız. Böylece hem onRestart() metodunu hem de onStart() metodunu kullanmak durumunda kalmamış olursunuz. Çünkü sistem yukarıda bahsettiğimiz gibi activitye dönüldüğü anda, onStart() metdounu her iki durumda da çağıracaktır.

Kullanıcı uygulamanızdan uzun süreliğine ayrıldığında, uygulamanıza geri dönmeden evvel onStart() metodu gerekli sistem ihtiyaçlarını ve özelliklerini doğrulamak için doğru metot olacaktır.

ÖRNEK:
@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 activitynizi yok ettiğinde, Activity için onDestroy() metodunu çağırır. onDestroy() metodunun çağırılmasına ihtiyaç kalmıyor, çünkü genellikle uygulamanızın kullanmış olduğu birçok sistem kaynaklarının onStop() metodunda durdurulması gerekmektedir. Fakat bu metot sistem kaynaklarının gereksiz kullanımını durdurmak için son şansınız demektir. Bu metot ile en son durdurmak isteyeceğiniz işlemleri tanımlamanız cihaz sistem kaynakları için çok önemlidir. Bunun üzerinde durmamızın sebebi uygulamanızın çalışma performansını ve kullanıcı deneyimin yüksek düzeyde tutmayı amaçlamamızdır.


Soru ve Görüşleriniz için: AndroidVeJava

Android-ActivityLifeCycleYönetimi-BirActivityDuraklatmakVeDevamEttirmek

23:44

Bir Activity Duraklatmak ve Devam Ettirmek


                Normal uygulama kullanımı sırasında, ekranda aktif olan activity diğer görsel bileşenler tarafından arka plana itilir ve activty’i pause konumuna geçirir. Örneğin, yarı-transparan bir activity (dialog kutuları gibi) açıldığında, bir önceki activity pause edilir. Diğer activity ekranda kaldığı sürece asıl ekran dikkat dışıdır ve paused (duraklatılmış) konumda bekler.
                Activity tamamen görünmez olur ve arka plana geçirilirse, Stopped(durdurulmuş) konuma geçer. (Bir sonraki konu bununla alakalı olacak)
                Activity’niz paused duruma geçtiğinde, sistem uygulamanızın sürdürdüğü işlemleri durdurmak için veya kullanıcının son işlemlerini kaydetmek için kullanabileceğiniz activity’niz içinde kodlanmış olan onPause() metodunu çağırır. Eğer kullanıcı paused durumdan activity’e geri dönüş yaparsa sistem uygulamanıza devam etmek için onResume() metodunu çağırır.

NOT:
Activity’niz onPause() metodunu çağırdığı anda, bu kullanıcını bir süre sonra uygulamanıza veya activity’nize geri döneceği anlamına gelir. Ancak genelde böyle olmaz ve kullanıcı activity’den tamamen ayrılır.



Activity’niz yarı transparan bir view tarafından arka plana itildiğinde, sistem onPause() metodunu çağırır ve activity paused(1) durumda bekler. Eğer kullanıcı activity’niz paused konumundayken geri gelirse, sistem onResume() (2) metodunu çağırır.

Activitynizi Duraklatmak


                Sistem onPause() metodunu çağırdığında bunun anlamı activity’ni kısmen görünür durumdadır. Ancak durum buna işaret etse de genel olarak kullanıcı activity’den ayrılmıştır ve yakında activity’niz Stopped duruma geçecek demektir. onPause() metodunu kullanmanız gereken durumlar;
·         CPU tüketebilecek, Animasyon veya diğer süregelen işlemleri duraklatmak için,
·         Kaydedilmeyen değişiklikleri sormak için ( tabii ki kullanıcının bu şekilde bir uyarı almasını gerektiren bir uygulama geliştiriyorsanız. Örneğin bir e-mail uygulaması…)
·         Broadcast Receivers(Yayın algılayıcılar), sensor işlemleri veya stopped durumda cihazın pil ömrünü azaltacak diğer kaynakların kullanıldığı uygulamalarda..
Örneğin, uygulamanız Kamera kullanıyorsa onPause() metodu kamerayı serbest bırakmak için ideal bir yerdir.

ÖRNEK:
@Override
public void onPause() {
    super.onPause();  // Always call the superclass method first

    // Release the Camera because we don't need it when paused
    // and other activities might need to use it.
    if (mCamera != null) {
        mCamera.release()
        mCamera = null;
    }
}

Genellikle, kullanıcı değişikliklerini geçici depolama alanlarına kaydetmek için onPause() metodunu kullanmamalısınız.  Bu işlemler için bu metodu kullanmanız gereken tek durum e-mail vb uygulamalarda olduğu gibi otomatik-kaydetme özelliği sağlamak istediğinizi zamanlardır. Ancak, bu işlemi yaparken CPU’nun yoğun kullanıldığı bir onPause()metodu kodlamaktan kaçınmalısınız.(DB yazma işlemleri tanımlamak gibi...) Çünkü bu işlem sırasında sistem kaynakları, geçiş yapılan diğer activity için yeteri kadar alan sahip olmayacağından kullanıcı deneyimini olumsuz etkileyecek bir işlem tanımlamış olursunuz.(yüksek sistem kaynağı kullanımına yol açabilecek işlemleriniz için onStop() metodunu kullanmalısınız.
NOT:
Activity’niz paused durumundayken, Activity örneği bellekte bir yer tutar ve activity e devam edileceği bu örnek geri çağırılır. Bu durumda activity’nizin bileşenlerini yeniden hazırlamanıza gerek yoktur.

Activitynizi Devam Ettirmek


                Kullanıcı activity’nizi durdurulmuş durumdan devam ettireceği zaman, sistem onResume() metodunu çağırır.
                Dikkat etmeniz gereken husus, activity’niz ilk defa oluşturulurken ve her ön plana çıkarılma durumunda bu metot sistem tarafından çağırılır. Eğer onPause() metoduyla durdurduğunuz işlemler varsa veya activity her Resumed duruma geçerken hazırlamanız gerek bileşenler var ise onResume() metodunu uygulamalı ve bu hazırlık kodlarını burada tanımlamanız gerekir.(durdurulan animasyonu tekrar başlatmak veya kullanıcını en son kaldığı konumları tekrar yüklemek için…)
                Aşağıdaki örnekte daha önce bahsedilen onPause() metodunun devamı olacak şekilde tanımlanmış bir onResume() metodu yer almaktadır.

 ÖRNEK:
@Override

public void onResume() {

    super.onResume();  // Always call the superclass method first



    // Get the Camera instance as the activity achieves full user focus

    if (mCamera == null) {

        initializeCamera(); // Local method to handle camera init

    }

}


Soru ve Görüşleriniz için: AndroidVeJava

Android-ActivityLifeCycleYönetimi-ActivityBaşlatmak

23:32





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>
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.


Soru ve Görüşleriniz için: AndroidVeJava
durdurmak etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
durdurmak etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

14 Mart 2015 Cumartesi

Android-ActivityLifeCycleYönetimi-BirActivityYenidenOluşturmak

Bir Activitynin Yeniden Oluşturulması



                Normal kullanım sırasında activity’nizin yok edilmesi durumu ile ilgili, kullanıcı Back butonuna basarak geri dönmesi veya activity kendi içinde finish() metoduyla destroy işareti alması gibi birkaç senaryo mevcuttur. Ayrıca sistem kullanıcının uygulamanızdan uzun bir süre boyunca ayrılması durumunda veya diğer bir uygulamanın daha fazla sistem kaynağına ihtiyaç duyması halinde arka planda kalan uygulamaların kapatılması gerektiğinde bu işlemi kendiliğinden yapabilir.
                Yukarıdaki sebeplerden hangisi ile olursa olsun, activity örneğinin yok edilmesi sistem tarafından Activity örneğine daha fazla ihtiyaç duyulmadığının anlaşılmasıyla gerçekleşir. Ancak, sistem kısıtlamaları nedeniyle bir activity örneği yok edildiğinde, gerçek activity örneği yok olsa bile kullanıcı bu uygulamaya geri döndüğünde, bu activity yok edildiğinde son duruma ait kayıtlı verilerin de yardımıyla sistem yeni bir örnek oluşturarak bu activityi hatırlayabilir. Kayıtlı veri dediğim bu veriler, “instance state” dediğimiz bir önceki activity durumunu yeniden oluşturmak için sistem tarafından kullanılır ve bu veriler Bundle nesnesinde saklanan anahtar-değer çiftleri seti ( collection of key-value pairs) olarak bilinir.

UYARI:
                Activity’niz kullanıcını cihazı yatay veya dikey olarak her yönlendirmesinde yok edilip yeniden oluşturulur. Ekran yönlendirmesi her değiştiğinde, sistem her yönlendirme için ihtiyaç duyulan farklı ara yüz kaynaklarını yüklemek için bu işlemi gerçekleştirir.
Varsayılan olarak, Activity layout tasarımında yer alan her bir View öğesi için sistem Bundle kullanarak son durumları saklamaktadır. (Örneğin, EditText nesnesine girilen text değerinin otomatik olarak saklanması). Bu sayede, ekran yönlendirmesi her değiştiğinde hali hazırda girilmiş olunan veya mevcut durum bilgilerini kaydetmek için ayrıca bir kod yazmanıza gerek kalmaması sağlanmış olur. Ancak, activity’niz kaydetmek isteyebileceğiniz kullanıcının yapmış olduğu son işlemleri takip edebilmenize yarayacak bilgiler gibi çok daha fazla durum bilgisi içeriyor olabilir. Bunlar için SharedPreferences konularında anlattığımız yetenekleri kullanmanız gerekecektir.

NOT:
Android sistem tarafından view öğelerinize ait durumların yeniden yüklenmesi durumunda her bir view android:id niteliği ile tanımlanmış benzersiz bir id’ye sahip olması gerekir.

Activity durumu ile ilgili olarak ek veriler kaydetmek için, onSaveInstanceState() metodunu Override etmelisiniz. Sistem bu metodu çağırarak, kullanıcının uygulamanızı (activitynizi) terk ettiği anda bu verileri Bundle nesnelerine geçirir ve beklenmedik sonlanmalar meydana gelmesi ihtimaline karşın son durumların kaydedilmesini sağlar. Eğer sistem activity örneğini daha sonra yeniden oluşturursa, bu veriler aynı Bundle nesnelerinden olan onRestoreInstanceState() ve onCreate() metotlarının her ikisine de geçirilir.




                Sistem activitynizi durduracağı zaman onSaveInstanceState() metodunu çağırır (1). Burada activitynizin daha sonra yeniden başlatılırken ihtiyaç duyacağı durum bilgilerini kaydedersiniz. Sistem (1) de tanımlanan durum bilgilerini hem onCreate() metoduna hem de onRestoreInstanceState() metoduna geçirir.(3)

Activitynizin Durumunu Kaydetme


                Activityniz durdurulacağı zaman, sistem onSaveInstanceState() metodunu çağırır ve activityniz son durum bilgisini anahtar-değer çiftleri setine kaydeder. Bu metodun varsayılan uygulamasında View hiyerarşisine göre activitynin durumu hakkındaki bilgiler kaydedilir. (Örneğin, EditText içindeki bir text değeri veya ListView içindeki scroll konumu gibi)
                Activitynize ait fazladan durum bilgisi kaydetmek için, onSaveInstanceState() metodunu uygulamalı ve anahtar-değer çiftlerini Bundle nesnelerine eklemelisiniz.

ÖRNEK:

static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
   
// Save the user's current game state
    savedInstanceState
.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState
.putInt(STATE_LEVEL, mCurrentLevel);
   
   
// Always call the superclass so it can save the view hierarchy state
   
super.onSaveInstanceState(savedInstanceState);
}

UYARI:
Her zaman onSaveInstanceState() metodunu superclass olarak uygulamalısınız böylece varsayılan uygulama ile view hiyerarşi durumunu kaydedebilirsiniz.

 

Activity Durumunu Yeniden Yüklemek


                Daha önce yok edilen activityniz yeniden oluşturulurken, sistem tarafından activitynizden Bundle nesnelerine geçirilen bilgiler dahilinde kayıtlı son durumu yeniden çağırabilirsiniz. onCreate() ve onRestoreInstanceState() metotlarının her ikisi de aynı Bundle kaynağından bu durum bilgilerini çeker.
                Bunun nedeni, activityniz ilk defa oluşturulurken veya daha önce yok edilen bir örnek yeniden oluşturulurken onCreate() metodu sistem tarafından çağırılmasıdır. Bundle nesnelerini okumaya çalışmadan evvel mutlaka bu nesnelerin boş mu? Dolu mu? olduklarını kontrol etmeniz gerekir. Eğer boş ise, sistem yok edilmiş bir örnek oluşturmak yerine activitynin yeni bir örneğini oluşturur.
onCreate() metoduyla bazı durum verilerini nasıl yeniden yüklendiğini inceleyelim.
ÖRNEK:

@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState); // Always call the superclass first

   

    // Check whether we're recreating a previously destroyed instance

    if (savedInstanceState != null) {

        // Restore value of members from saved state

        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);

        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);

    } else {

        // Probably initialize members with default values for a new instance

    }

    ...

}

onCreate() metodu yerine sistem tarafından onStart () metodunun hemen ardından çağırılacak olan onRestoreInstanceState() metoduyla yeniden yükleme işlemi yapmak isterseniz, Bundle nesnelerini kontrol etmenize gerek kalmaz.

ÖRNEK:

public void onRestoreInstanceState(Bundle savedInstanceState) {

    // Always call the superclass so it can restore the view hierarchy

    super.onRestoreInstanceState(savedInstanceState);

   

    // Restore state members from saved instance

    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);

    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);

}

UYARI:
Her zaman onRestoreInstanceState() metodunu superclass olarak uygulamalısınız böylece varsayılan uygulama ile view hiyerarşi durumunu kolaylıkla yeniden oluşturabilirsiniz.


Soru ve Görüşleriniz için: AndroidVeJava

Android-ActivityLifeCycleYönetimi-BirActivityDurdurmakVeYenidenBaşlatmak

Bir Activity Durdurmak ve Yeniden Başlatmak


                Düzenli bir durdurma ve yeniden başlatma işlemi kullanıcın activity’nize geri döndüğünde sürekli aktif ve kullanıcı bilgilerinin korunması için önemli bir işlem sürecidir. Activity’nizin durdurulup yeniden başlatılmaya ihtiyaç duyacağı birkaç senaryodan bazıları aşağıdaki gibi olabilir.
·         Kullanıcı Recent Apps( son kullanılan Uygulamalar) menüsünü açıp farklı uygulamalara geçiş yapabilir. Bu durumda uygulamanızın ekranda bulunan activity örneği durdurulur. Kullanıcı ana ekranda yer alan bulunan uygulama ikonunuza dokunduğunda veya Recent Apps penceresinden geri geldiğinde activity yeniden başlatılır.
·         Kullanıcı uygulamanız içinden yeni bir activity başlatacak bir işlem gerçekleştirdiğinde mevcut activity durdurulur ve diğer activity başlatılır. Kullanıcı back butonun bastığında ilk activity tekrar başlatılır.
·         Kullanıcı uygulamanızı kullandığı anda bir çağrı alınca…

Activity sınıfı, uygulamanızın durdurulması ve yeniden başlatılması gibi durumlarda uygulamanızın nasıl davranacağına karar vermek için onStop() ve onRestart() gibi iki yaşam döngüsü metodu tanımlar. Paused durumdan farklı olarak, (kısmen UI arka plana itildiği durum olarak tanımlanan) stopped durum UI nin tamamen arka plana atılmasını ve hiçbir şekilde görünmemesini garanti ederek activity den kullanıcının dikkatini tamamen keser.

NOT:
Sistem Activityniz stopped duruma geçtiğinde bu activitynin bir örneğini bellekte sakladığı için, onStop() veya onRestart() metodunu uygulamanıza gerek kalmaz. Hatta onStart() metodunu bile uygulamanız gerekmeyebilir. Birçok activity nispeten basittirler ve çok rahat bir şekilde durdurulup başlatılabilirler ve size sadece süregelen işlemleri durdurmak için onPause() metodunu kullanmak kalır.



     Kullanıcı activity’nizden ayrıldığında, sistem onStop() metodunu çağırarak activity i durdurur(1). Activity durdurulduğunda kullanıcı geri gelirse, sistem onRestart()(2) metodunu çağırır ve bunu hızlıca onStart()(3) ve onResume()(4) metodu takip eder. Dikkat etmeniz gereken asıl konu ise ne türlü bir senaryo gerçekleşecek olursa olsun, sistem onStop() metodundan evvel onPause() metodunu çağırır.

Activity Durdurmak


                Activity’niz onStop() metodunu çağırdığında, bu demek oluyor ki artık bu activity daha fazla görünmeyecek ve kullanıcının ihtiyaç duymadığı ne kadar kaynak var ise serbest bırakılacak demektir. Activity’niz durdurulduğunda, sistem kaynağına ihtiyaç var ise bu activity örneği yok edilecektir. Diğer bellek gerektiren ekstra durumlarda, sistem uygulamanızı onDestroy() metodunu çağırmaya ihtiyaç duymadan sonlandırabilir. Bu nedenle onStop() metodunu kullanmanızdaki en büyük fayda sistemin bu yola başvurmadan evvel sizin sistem kaynaklarını serbest bırakmanızdır.
                onPause() metodu onStop() metodundan evvel çağırılmasına rağmen, aşırı sistem kaynağını tüketen işlemleri sonlandırmak için onStop() metodunu kullanmanız her zaman daha verimli bir işlem olacaktır.

                Aşağıdaki örnekte, onStop() metodunun bir uygulaması görülmektedir. Bu uygulama ile geçici belleği not defterinde tutulan kayıtların kaydedilme işlemi icra ediliyor.

ÖRNEK:
@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’niz durdurulduğunda, Activity nesnesi bellekte bir yer tutar ve yeniden çağırıldığında activity devam eder. Bu süreç içerisinde uygulamanızın bileşenlerini yeniden hazırlamanız gerekmemektedir. Sistem ayrıca mevcut duruma ait her bir View’in izini de saklar. Böylece kullanıcı EditText öğesine bir veri girişi yaptığında bu otomatik olarak, sizin herhangi bir saklama prosedürü uygulamanıza gerek kalmadan saklanır.

NOT:
Stopped durumda sistem activity’nizin yok etse bile, bu activitye ait View nesnelerinin durumlarını Bundle içerisinde korur ve kullanıcı aynı activity örneğine geri döndüğünde UI nin son haliyle uygulama çalışmaya devam eder. ( Bir sonraki konuda Bundle hakkında daha detaylı bilgi aktaracağız)

Bir Activity’nin Başlatılması/Yeniden Başlatılması


                Activityniz Stopped durumdan tekrar ön plana geldiğinde, onRestart() metoduna geçer. Ayrıca sistem, activityniz her ön plana geldiğinde olduğu gibi onStart() metodunu da çağırır. onRestart() metodu sadece activity stopped durumdan devam ederken çağırılır. Böylece öncelikle stopped duruma geçen uygulamanız için bazı özel restorasyonları gerçekleştirme imkânı elde etmiş olursunuz.
                Uygulamanın activity durumunu onRestart() metodu ile restore etmesi aslında çok yaygın bir kullanım değildir. Çünkü genel uygulama dünyasında bu tarz bir yönetime pek ihtiyaç duyulmamaktadır. onStop() metodu activitynizin kullandığı tüm kaynakları temizlemek için uygulanmalıdır. Ancak bu işlem sonrası Activity yeniden çağırıldığında durdurduğunuz tüm işlemleri yeniden hazırlamanız gerekecektir. Bunun yanında Activity’niz yeniden oluşturulduğu durumlarda da bu hazırlıkları yapmanız gerekcektir.( hiçbir şekilde activity örneğinizin olmadığı durum). Bu nedenle, onStop() metoduna karşılık olarak her zaman onStart() metodunu kullanmalısınız. Böylece hem onRestart() metodunu hem de onStart() metodunu kullanmak durumunda kalmamış olursunuz. Çünkü sistem yukarıda bahsettiğimiz gibi activitye dönüldüğü anda, onStart() metdounu her iki durumda da çağıracaktır.

Kullanıcı uygulamanızdan uzun süreliğine ayrıldığında, uygulamanıza geri dönmeden evvel onStart() metodu gerekli sistem ihtiyaçlarını ve özelliklerini doğrulamak için doğru metot olacaktır.

ÖRNEK:
@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 activitynizi yok ettiğinde, Activity için onDestroy() metodunu çağırır. onDestroy() metodunun çağırılmasına ihtiyaç kalmıyor, çünkü genellikle uygulamanızın kullanmış olduğu birçok sistem kaynaklarının onStop() metodunda durdurulması gerekmektedir. Fakat bu metot sistem kaynaklarının gereksiz kullanımını durdurmak için son şansınız demektir. Bu metot ile en son durdurmak isteyeceğiniz işlemleri tanımlamanız cihaz sistem kaynakları için çok önemlidir. Bunun üzerinde durmamızın sebebi uygulamanızın çalışma performansını ve kullanıcı deneyimin yüksek düzeyde tutmayı amaçlamamızdır.


Soru ve Görüşleriniz için: AndroidVeJava

Android-ActivityLifeCycleYönetimi-BirActivityDuraklatmakVeDevamEttirmek

Bir Activity Duraklatmak ve Devam Ettirmek


                Normal uygulama kullanımı sırasında, ekranda aktif olan activity diğer görsel bileşenler tarafından arka plana itilir ve activty’i pause konumuna geçirir. Örneğin, yarı-transparan bir activity (dialog kutuları gibi) açıldığında, bir önceki activity pause edilir. Diğer activity ekranda kaldığı sürece asıl ekran dikkat dışıdır ve paused (duraklatılmış) konumda bekler.
                Activity tamamen görünmez olur ve arka plana geçirilirse, Stopped(durdurulmuş) konuma geçer. (Bir sonraki konu bununla alakalı olacak)
                Activity’niz paused duruma geçtiğinde, sistem uygulamanızın sürdürdüğü işlemleri durdurmak için veya kullanıcının son işlemlerini kaydetmek için kullanabileceğiniz activity’niz içinde kodlanmış olan onPause() metodunu çağırır. Eğer kullanıcı paused durumdan activity’e geri dönüş yaparsa sistem uygulamanıza devam etmek için onResume() metodunu çağırır.

NOT:
Activity’niz onPause() metodunu çağırdığı anda, bu kullanıcını bir süre sonra uygulamanıza veya activity’nize geri döneceği anlamına gelir. Ancak genelde böyle olmaz ve kullanıcı activity’den tamamen ayrılır.



Activity’niz yarı transparan bir view tarafından arka plana itildiğinde, sistem onPause() metodunu çağırır ve activity paused(1) durumda bekler. Eğer kullanıcı activity’niz paused konumundayken geri gelirse, sistem onResume() (2) metodunu çağırır.

Activitynizi Duraklatmak


                Sistem onPause() metodunu çağırdığında bunun anlamı activity’ni kısmen görünür durumdadır. Ancak durum buna işaret etse de genel olarak kullanıcı activity’den ayrılmıştır ve yakında activity’niz Stopped duruma geçecek demektir. onPause() metodunu kullanmanız gereken durumlar;
·         CPU tüketebilecek, Animasyon veya diğer süregelen işlemleri duraklatmak için,
·         Kaydedilmeyen değişiklikleri sormak için ( tabii ki kullanıcının bu şekilde bir uyarı almasını gerektiren bir uygulama geliştiriyorsanız. Örneğin bir e-mail uygulaması…)
·         Broadcast Receivers(Yayın algılayıcılar), sensor işlemleri veya stopped durumda cihazın pil ömrünü azaltacak diğer kaynakların kullanıldığı uygulamalarda..
Örneğin, uygulamanız Kamera kullanıyorsa onPause() metodu kamerayı serbest bırakmak için ideal bir yerdir.

ÖRNEK:
@Override
public void onPause() {
    super.onPause();  // Always call the superclass method first

    // Release the Camera because we don't need it when paused
    // and other activities might need to use it.
    if (mCamera != null) {
        mCamera.release()
        mCamera = null;
    }
}

Genellikle, kullanıcı değişikliklerini geçici depolama alanlarına kaydetmek için onPause() metodunu kullanmamalısınız.  Bu işlemler için bu metodu kullanmanız gereken tek durum e-mail vb uygulamalarda olduğu gibi otomatik-kaydetme özelliği sağlamak istediğinizi zamanlardır. Ancak, bu işlemi yaparken CPU’nun yoğun kullanıldığı bir onPause()metodu kodlamaktan kaçınmalısınız.(DB yazma işlemleri tanımlamak gibi...) Çünkü bu işlem sırasında sistem kaynakları, geçiş yapılan diğer activity için yeteri kadar alan sahip olmayacağından kullanıcı deneyimini olumsuz etkileyecek bir işlem tanımlamış olursunuz.(yüksek sistem kaynağı kullanımına yol açabilecek işlemleriniz için onStop() metodunu kullanmalısınız.
NOT:
Activity’niz paused durumundayken, Activity örneği bellekte bir yer tutar ve activity e devam edileceği bu örnek geri çağırılır. Bu durumda activity’nizin bileşenlerini yeniden hazırlamanıza gerek yoktur.

Activitynizi Devam Ettirmek


                Kullanıcı activity’nizi durdurulmuş durumdan devam ettireceği zaman, sistem onResume() metodunu çağırır.
                Dikkat etmeniz gereken husus, activity’niz ilk defa oluşturulurken ve her ön plana çıkarılma durumunda bu metot sistem tarafından çağırılır. Eğer onPause() metoduyla durdurduğunuz işlemler varsa veya activity her Resumed duruma geçerken hazırlamanız gerek bileşenler var ise onResume() metodunu uygulamalı ve bu hazırlık kodlarını burada tanımlamanız gerekir.(durdurulan animasyonu tekrar başlatmak veya kullanıcını en son kaldığı konumları tekrar yüklemek için…)
                Aşağıdaki örnekte daha önce bahsedilen onPause() metodunun devamı olacak şekilde tanımlanmış bir onResume() metodu yer almaktadır.

 ÖRNEK:
@Override

public void onResume() {

    super.onResume();  // Always call the superclass method first



    // Get the Camera instance as the activity achieves full user focus

    if (mCamera == null) {

        initializeCamera(); // Local method to handle camera init

    }

}


Soru ve Görüşleriniz için: AndroidVeJava

Android-ActivityLifeCycleYönetimi-ActivityBaşlatmak






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>
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.


Soru ve Görüşleriniz için: AndroidVeJava
durdurmak etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
durdurmak etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

14 Mart 2015 Cumartesi

Android-ActivityLifeCycleYönetimi-BirActivityYenidenOluşturmak

Bir Activitynin Yeniden Oluşturulması



                Normal kullanım sırasında activity’nizin yok edilmesi durumu ile ilgili, kullanıcı Back butonuna basarak geri dönmesi veya activity kendi içinde finish() metoduyla destroy işareti alması gibi birkaç senaryo mevcuttur. Ayrıca sistem kullanıcının uygulamanızdan uzun bir süre boyunca ayrılması durumunda veya diğer bir uygulamanın daha fazla sistem kaynağına ihtiyaç duyması halinde arka planda kalan uygulamaların kapatılması gerektiğinde bu işlemi kendiliğinden yapabilir.
                Yukarıdaki sebeplerden hangisi ile olursa olsun, activity örneğinin yok edilmesi sistem tarafından Activity örneğine daha fazla ihtiyaç duyulmadığının anlaşılmasıyla gerçekleşir. Ancak, sistem kısıtlamaları nedeniyle bir activity örneği yok edildiğinde, gerçek activity örneği yok olsa bile kullanıcı bu uygulamaya geri döndüğünde, bu activity yok edildiğinde son duruma ait kayıtlı verilerin de yardımıyla sistem yeni bir örnek oluşturarak bu activityi hatırlayabilir. Kayıtlı veri dediğim bu veriler, “instance state” dediğimiz bir önceki activity durumunu yeniden oluşturmak için sistem tarafından kullanılır ve bu veriler Bundle nesnesinde saklanan anahtar-değer çiftleri seti ( collection of key-value pairs) olarak bilinir.

UYARI:
                Activity’niz kullanıcını cihazı yatay veya dikey olarak her yönlendirmesinde yok edilip yeniden oluşturulur. Ekran yönlendirmesi her değiştiğinde, sistem her yönlendirme için ihtiyaç duyulan farklı ara yüz kaynaklarını yüklemek için bu işlemi gerçekleştirir.
Varsayılan olarak, Activity layout tasarımında yer alan her bir View öğesi için sistem Bundle kullanarak son durumları saklamaktadır. (Örneğin, EditText nesnesine girilen text değerinin otomatik olarak saklanması). Bu sayede, ekran yönlendirmesi her değiştiğinde hali hazırda girilmiş olunan veya mevcut durum bilgilerini kaydetmek için ayrıca bir kod yazmanıza gerek kalmaması sağlanmış olur. Ancak, activity’niz kaydetmek isteyebileceğiniz kullanıcının yapmış olduğu son işlemleri takip edebilmenize yarayacak bilgiler gibi çok daha fazla durum bilgisi içeriyor olabilir. Bunlar için SharedPreferences konularında anlattığımız yetenekleri kullanmanız gerekecektir.

NOT:
Android sistem tarafından view öğelerinize ait durumların yeniden yüklenmesi durumunda her bir view android:id niteliği ile tanımlanmış benzersiz bir id’ye sahip olması gerekir.

Activity durumu ile ilgili olarak ek veriler kaydetmek için, onSaveInstanceState() metodunu Override etmelisiniz. Sistem bu metodu çağırarak, kullanıcının uygulamanızı (activitynizi) terk ettiği anda bu verileri Bundle nesnelerine geçirir ve beklenmedik sonlanmalar meydana gelmesi ihtimaline karşın son durumların kaydedilmesini sağlar. Eğer sistem activity örneğini daha sonra yeniden oluşturursa, bu veriler aynı Bundle nesnelerinden olan onRestoreInstanceState() ve onCreate() metotlarının her ikisine de geçirilir.




                Sistem activitynizi durduracağı zaman onSaveInstanceState() metodunu çağırır (1). Burada activitynizin daha sonra yeniden başlatılırken ihtiyaç duyacağı durum bilgilerini kaydedersiniz. Sistem (1) de tanımlanan durum bilgilerini hem onCreate() metoduna hem de onRestoreInstanceState() metoduna geçirir.(3)

Activitynizin Durumunu Kaydetme


                Activityniz durdurulacağı zaman, sistem onSaveInstanceState() metodunu çağırır ve activityniz son durum bilgisini anahtar-değer çiftleri setine kaydeder. Bu metodun varsayılan uygulamasında View hiyerarşisine göre activitynin durumu hakkındaki bilgiler kaydedilir. (Örneğin, EditText içindeki bir text değeri veya ListView içindeki scroll konumu gibi)
                Activitynize ait fazladan durum bilgisi kaydetmek için, onSaveInstanceState() metodunu uygulamalı ve anahtar-değer çiftlerini Bundle nesnelerine eklemelisiniz.

ÖRNEK:

static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
   
// Save the user's current game state
    savedInstanceState
.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState
.putInt(STATE_LEVEL, mCurrentLevel);
   
   
// Always call the superclass so it can save the view hierarchy state
   
super.onSaveInstanceState(savedInstanceState);
}

UYARI:
Her zaman onSaveInstanceState() metodunu superclass olarak uygulamalısınız böylece varsayılan uygulama ile view hiyerarşi durumunu kaydedebilirsiniz.

 

Activity Durumunu Yeniden Yüklemek


                Daha önce yok edilen activityniz yeniden oluşturulurken, sistem tarafından activitynizden Bundle nesnelerine geçirilen bilgiler dahilinde kayıtlı son durumu yeniden çağırabilirsiniz. onCreate() ve onRestoreInstanceState() metotlarının her ikisi de aynı Bundle kaynağından bu durum bilgilerini çeker.
                Bunun nedeni, activityniz ilk defa oluşturulurken veya daha önce yok edilen bir örnek yeniden oluşturulurken onCreate() metodu sistem tarafından çağırılmasıdır. Bundle nesnelerini okumaya çalışmadan evvel mutlaka bu nesnelerin boş mu? Dolu mu? olduklarını kontrol etmeniz gerekir. Eğer boş ise, sistem yok edilmiş bir örnek oluşturmak yerine activitynin yeni bir örneğini oluşturur.
onCreate() metoduyla bazı durum verilerini nasıl yeniden yüklendiğini inceleyelim.
ÖRNEK:

@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState); // Always call the superclass first

   

    // Check whether we're recreating a previously destroyed instance

    if (savedInstanceState != null) {

        // Restore value of members from saved state

        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);

        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);

    } else {

        // Probably initialize members with default values for a new instance

    }

    ...

}

onCreate() metodu yerine sistem tarafından onStart () metodunun hemen ardından çağırılacak olan onRestoreInstanceState() metoduyla yeniden yükleme işlemi yapmak isterseniz, Bundle nesnelerini kontrol etmenize gerek kalmaz.

ÖRNEK:

public void onRestoreInstanceState(Bundle savedInstanceState) {

    // Always call the superclass so it can restore the view hierarchy

    super.onRestoreInstanceState(savedInstanceState);

   

    // Restore state members from saved instance

    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);

    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);

}

UYARI:
Her zaman onRestoreInstanceState() metodunu superclass olarak uygulamalısınız böylece varsayılan uygulama ile view hiyerarşi durumunu kolaylıkla yeniden oluşturabilirsiniz.


Soru ve Görüşleriniz için: AndroidVeJava

Android-ActivityLifeCycleYönetimi-BirActivityDurdurmakVeYenidenBaşlatmak

Bir Activity Durdurmak ve Yeniden Başlatmak


                Düzenli bir durdurma ve yeniden başlatma işlemi kullanıcın activity’nize geri döndüğünde sürekli aktif ve kullanıcı bilgilerinin korunması için önemli bir işlem sürecidir. Activity’nizin durdurulup yeniden başlatılmaya ihtiyaç duyacağı birkaç senaryodan bazıları aşağıdaki gibi olabilir.
·         Kullanıcı Recent Apps( son kullanılan Uygulamalar) menüsünü açıp farklı uygulamalara geçiş yapabilir. Bu durumda uygulamanızın ekranda bulunan activity örneği durdurulur. Kullanıcı ana ekranda yer alan bulunan uygulama ikonunuza dokunduğunda veya Recent Apps penceresinden geri geldiğinde activity yeniden başlatılır.
·         Kullanıcı uygulamanız içinden yeni bir activity başlatacak bir işlem gerçekleştirdiğinde mevcut activity durdurulur ve diğer activity başlatılır. Kullanıcı back butonun bastığında ilk activity tekrar başlatılır.
·         Kullanıcı uygulamanızı kullandığı anda bir çağrı alınca…

Activity sınıfı, uygulamanızın durdurulması ve yeniden başlatılması gibi durumlarda uygulamanızın nasıl davranacağına karar vermek için onStop() ve onRestart() gibi iki yaşam döngüsü metodu tanımlar. Paused durumdan farklı olarak, (kısmen UI arka plana itildiği durum olarak tanımlanan) stopped durum UI nin tamamen arka plana atılmasını ve hiçbir şekilde görünmemesini garanti ederek activity den kullanıcının dikkatini tamamen keser.

NOT:
Sistem Activityniz stopped duruma geçtiğinde bu activitynin bir örneğini bellekte sakladığı için, onStop() veya onRestart() metodunu uygulamanıza gerek kalmaz. Hatta onStart() metodunu bile uygulamanız gerekmeyebilir. Birçok activity nispeten basittirler ve çok rahat bir şekilde durdurulup başlatılabilirler ve size sadece süregelen işlemleri durdurmak için onPause() metodunu kullanmak kalır.



     Kullanıcı activity’nizden ayrıldığında, sistem onStop() metodunu çağırarak activity i durdurur(1). Activity durdurulduğunda kullanıcı geri gelirse, sistem onRestart()(2) metodunu çağırır ve bunu hızlıca onStart()(3) ve onResume()(4) metodu takip eder. Dikkat etmeniz gereken asıl konu ise ne türlü bir senaryo gerçekleşecek olursa olsun, sistem onStop() metodundan evvel onPause() metodunu çağırır.

Activity Durdurmak


                Activity’niz onStop() metodunu çağırdığında, bu demek oluyor ki artık bu activity daha fazla görünmeyecek ve kullanıcının ihtiyaç duymadığı ne kadar kaynak var ise serbest bırakılacak demektir. Activity’niz durdurulduğunda, sistem kaynağına ihtiyaç var ise bu activity örneği yok edilecektir. Diğer bellek gerektiren ekstra durumlarda, sistem uygulamanızı onDestroy() metodunu çağırmaya ihtiyaç duymadan sonlandırabilir. Bu nedenle onStop() metodunu kullanmanızdaki en büyük fayda sistemin bu yola başvurmadan evvel sizin sistem kaynaklarını serbest bırakmanızdır.
                onPause() metodu onStop() metodundan evvel çağırılmasına rağmen, aşırı sistem kaynağını tüketen işlemleri sonlandırmak için onStop() metodunu kullanmanız her zaman daha verimli bir işlem olacaktır.

                Aşağıdaki örnekte, onStop() metodunun bir uygulaması görülmektedir. Bu uygulama ile geçici belleği not defterinde tutulan kayıtların kaydedilme işlemi icra ediliyor.

ÖRNEK:
@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’niz durdurulduğunda, Activity nesnesi bellekte bir yer tutar ve yeniden çağırıldığında activity devam eder. Bu süreç içerisinde uygulamanızın bileşenlerini yeniden hazırlamanız gerekmemektedir. Sistem ayrıca mevcut duruma ait her bir View’in izini de saklar. Böylece kullanıcı EditText öğesine bir veri girişi yaptığında bu otomatik olarak, sizin herhangi bir saklama prosedürü uygulamanıza gerek kalmadan saklanır.

NOT:
Stopped durumda sistem activity’nizin yok etse bile, bu activitye ait View nesnelerinin durumlarını Bundle içerisinde korur ve kullanıcı aynı activity örneğine geri döndüğünde UI nin son haliyle uygulama çalışmaya devam eder. ( Bir sonraki konuda Bundle hakkında daha detaylı bilgi aktaracağız)

Bir Activity’nin Başlatılması/Yeniden Başlatılması


                Activityniz Stopped durumdan tekrar ön plana geldiğinde, onRestart() metoduna geçer. Ayrıca sistem, activityniz her ön plana geldiğinde olduğu gibi onStart() metodunu da çağırır. onRestart() metodu sadece activity stopped durumdan devam ederken çağırılır. Böylece öncelikle stopped duruma geçen uygulamanız için bazı özel restorasyonları gerçekleştirme imkânı elde etmiş olursunuz.
                Uygulamanın activity durumunu onRestart() metodu ile restore etmesi aslında çok yaygın bir kullanım değildir. Çünkü genel uygulama dünyasında bu tarz bir yönetime pek ihtiyaç duyulmamaktadır. onStop() metodu activitynizin kullandığı tüm kaynakları temizlemek için uygulanmalıdır. Ancak bu işlem sonrası Activity yeniden çağırıldığında durdurduğunuz tüm işlemleri yeniden hazırlamanız gerekecektir. Bunun yanında Activity’niz yeniden oluşturulduğu durumlarda da bu hazırlıkları yapmanız gerekcektir.( hiçbir şekilde activity örneğinizin olmadığı durum). Bu nedenle, onStop() metoduna karşılık olarak her zaman onStart() metodunu kullanmalısınız. Böylece hem onRestart() metodunu hem de onStart() metodunu kullanmak durumunda kalmamış olursunuz. Çünkü sistem yukarıda bahsettiğimiz gibi activitye dönüldüğü anda, onStart() metdounu her iki durumda da çağıracaktır.

Kullanıcı uygulamanızdan uzun süreliğine ayrıldığında, uygulamanıza geri dönmeden evvel onStart() metodu gerekli sistem ihtiyaçlarını ve özelliklerini doğrulamak için doğru metot olacaktır.

ÖRNEK:
@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 activitynizi yok ettiğinde, Activity için onDestroy() metodunu çağırır. onDestroy() metodunun çağırılmasına ihtiyaç kalmıyor, çünkü genellikle uygulamanızın kullanmış olduğu birçok sistem kaynaklarının onStop() metodunda durdurulması gerekmektedir. Fakat bu metot sistem kaynaklarının gereksiz kullanımını durdurmak için son şansınız demektir. Bu metot ile en son durdurmak isteyeceğiniz işlemleri tanımlamanız cihaz sistem kaynakları için çok önemlidir. Bunun üzerinde durmamızın sebebi uygulamanızın çalışma performansını ve kullanıcı deneyimin yüksek düzeyde tutmayı amaçlamamızdır.


Soru ve Görüşleriniz için: AndroidVeJava

Android-ActivityLifeCycleYönetimi-BirActivityDuraklatmakVeDevamEttirmek

Bir Activity Duraklatmak ve Devam Ettirmek


                Normal uygulama kullanımı sırasında, ekranda aktif olan activity diğer görsel bileşenler tarafından arka plana itilir ve activty’i pause konumuna geçirir. Örneğin, yarı-transparan bir activity (dialog kutuları gibi) açıldığında, bir önceki activity pause edilir. Diğer activity ekranda kaldığı sürece asıl ekran dikkat dışıdır ve paused (duraklatılmış) konumda bekler.
                Activity tamamen görünmez olur ve arka plana geçirilirse, Stopped(durdurulmuş) konuma geçer. (Bir sonraki konu bununla alakalı olacak)
                Activity’niz paused duruma geçtiğinde, sistem uygulamanızın sürdürdüğü işlemleri durdurmak için veya kullanıcının son işlemlerini kaydetmek için kullanabileceğiniz activity’niz içinde kodlanmış olan onPause() metodunu çağırır. Eğer kullanıcı paused durumdan activity’e geri dönüş yaparsa sistem uygulamanıza devam etmek için onResume() metodunu çağırır.

NOT:
Activity’niz onPause() metodunu çağırdığı anda, bu kullanıcını bir süre sonra uygulamanıza veya activity’nize geri döneceği anlamına gelir. Ancak genelde böyle olmaz ve kullanıcı activity’den tamamen ayrılır.



Activity’niz yarı transparan bir view tarafından arka plana itildiğinde, sistem onPause() metodunu çağırır ve activity paused(1) durumda bekler. Eğer kullanıcı activity’niz paused konumundayken geri gelirse, sistem onResume() (2) metodunu çağırır.

Activitynizi Duraklatmak


                Sistem onPause() metodunu çağırdığında bunun anlamı activity’ni kısmen görünür durumdadır. Ancak durum buna işaret etse de genel olarak kullanıcı activity’den ayrılmıştır ve yakında activity’niz Stopped duruma geçecek demektir. onPause() metodunu kullanmanız gereken durumlar;
·         CPU tüketebilecek, Animasyon veya diğer süregelen işlemleri duraklatmak için,
·         Kaydedilmeyen değişiklikleri sormak için ( tabii ki kullanıcının bu şekilde bir uyarı almasını gerektiren bir uygulama geliştiriyorsanız. Örneğin bir e-mail uygulaması…)
·         Broadcast Receivers(Yayın algılayıcılar), sensor işlemleri veya stopped durumda cihazın pil ömrünü azaltacak diğer kaynakların kullanıldığı uygulamalarda..
Örneğin, uygulamanız Kamera kullanıyorsa onPause() metodu kamerayı serbest bırakmak için ideal bir yerdir.

ÖRNEK:
@Override
public void onPause() {
    super.onPause();  // Always call the superclass method first

    // Release the Camera because we don't need it when paused
    // and other activities might need to use it.
    if (mCamera != null) {
        mCamera.release()
        mCamera = null;
    }
}

Genellikle, kullanıcı değişikliklerini geçici depolama alanlarına kaydetmek için onPause() metodunu kullanmamalısınız.  Bu işlemler için bu metodu kullanmanız gereken tek durum e-mail vb uygulamalarda olduğu gibi otomatik-kaydetme özelliği sağlamak istediğinizi zamanlardır. Ancak, bu işlemi yaparken CPU’nun yoğun kullanıldığı bir onPause()metodu kodlamaktan kaçınmalısınız.(DB yazma işlemleri tanımlamak gibi...) Çünkü bu işlem sırasında sistem kaynakları, geçiş yapılan diğer activity için yeteri kadar alan sahip olmayacağından kullanıcı deneyimini olumsuz etkileyecek bir işlem tanımlamış olursunuz.(yüksek sistem kaynağı kullanımına yol açabilecek işlemleriniz için onStop() metodunu kullanmalısınız.
NOT:
Activity’niz paused durumundayken, Activity örneği bellekte bir yer tutar ve activity e devam edileceği bu örnek geri çağırılır. Bu durumda activity’nizin bileşenlerini yeniden hazırlamanıza gerek yoktur.

Activitynizi Devam Ettirmek


                Kullanıcı activity’nizi durdurulmuş durumdan devam ettireceği zaman, sistem onResume() metodunu çağırır.
                Dikkat etmeniz gereken husus, activity’niz ilk defa oluşturulurken ve her ön plana çıkarılma durumunda bu metot sistem tarafından çağırılır. Eğer onPause() metoduyla durdurduğunuz işlemler varsa veya activity her Resumed duruma geçerken hazırlamanız gerek bileşenler var ise onResume() metodunu uygulamalı ve bu hazırlık kodlarını burada tanımlamanız gerekir.(durdurulan animasyonu tekrar başlatmak veya kullanıcını en son kaldığı konumları tekrar yüklemek için…)
                Aşağıdaki örnekte daha önce bahsedilen onPause() metodunun devamı olacak şekilde tanımlanmış bir onResume() metodu yer almaktadır.

 ÖRNEK:
@Override

public void onResume() {

    super.onResume();  // Always call the superclass method first



    // Get the Camera instance as the activity achieves full user focus

    if (mCamera == null) {

        initializeCamera(); // Local method to handle camera init

    }

}


Soru ve Görüşleriniz için: AndroidVeJava

Android-ActivityLifeCycleYönetimi-ActivityBaşlatmak






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>
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.


Soru ve Görüşleriniz için: AndroidVeJava