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.

14 Mart 2015 Cumartesi

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

14 Mart 2015 Cumartesi

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

14 Mart 2015 Cumartesi

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