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.

activity duraklatmak etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
activity duraklatmak 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
activity duraklatmak etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
activity duraklatmak 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
activity duraklatmak etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
activity duraklatmak 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