Android Activity Launch Mode

Merhaba Arkadaşlar,
Mobilhanem.com sitemiz üzerinden anlattığımız/yayınladığımız Android Dersleri serisine bu dersimizde Launch Mode hakkında bilgi vererek devam ediyoruz. Launch mode activity’i başlatma yöntemidir diyebiliriz. Yani activity başlarken yeni bir instance mı oluşacak ,oluşmuş olan instance’a mı bağlanacak gibi durumları Launch Mode ile ayarlarız.

Zaten bu dersi okuma ihtiyacı duyduysanız Android’de activity nedir konusuna hakimsiniz demektir. Bence her android geliştiricinin bilmesi gerektiği bir konudur Launch Mode. Konuya başlamadan önce Task nedir diye anlatmam gerekir.

Task

Oluşturulan activity’ler bir collection’da (stack) tutulur. Biz activityleri oluşturdukca bu activityler bir stacke atılır.  Stack nedir dersek stack bir collection’dır ve son giren ilk çıkar mantığı ile çalışır. Nediyor ya bu dediğinizi duyar gibiyim:)

Bildiğimiz konulardan anlatmaya çalışayım. Bir activity açıkken startActivity() ile yeni bir activity oluşturduk diyelim ve bir önceki activity’i finish() metotu ile sonlandırmadık. Yeni activity’deyken android cihazımızda back tuşuna basarsak bir önceki activity’e döneriz. Android bu yapıyı stack’ler üzerinden kurmuştur. Stack bir veri yapısıdır. Son eklenen veri her zaman ilk geri alınır. Bu yüzden art arda 5 activity açtığımızda geri tuşuna bastığımızda en son eklenen activity’e geri dönüyoruz. Bu dersimiz için stack’in çalışma mantığını bilmek zorunda değiliz ama merak edenler için stack hakkında daha detaylı bilgi için tıklayınız. Android’de stackin adını Back Stack olarak adlandırıyoruz.

Activity’lerin bir Back Stack’e eklenmesini , silinmesini o an hangi activity’nin kullanıcıya gösterilmesinin yönetilmesini ise Task yapıyor. Yani Task back stack’imize activity ekliyor , çıkarıyor , kullanıcıya activityleri gösterilmesi için gerekli işlemleri yapıyor.

Launch Mode

Android’de 4 adet Launch Mode vardır.

1 – standart

2 – singleTop

3 – singleTask

4 – singleInstance

AndroidManifest.xml dosyasında<activity> elementinin içinde “launchMode” attribute ekleyerek kullanabiliriz:

Örnek:

Dersimizin kalanında kullanacağımız A,B,C,D,E,F harflerinin birer activity olduğunu varsayalım.

1-standart

“standart” default olarak kullanılandır. Yani biz herhangibi bir tanımlama yapmazsak launchMode attribute eklemezsek, android default olarak standart’ı kullanır.

Peki standart olunca ne oluyor derseniz aşağıdaki seneryo üzerinden anlatayım.

A activity’sini başlattığımız zaman Back Stack’e A activitysi koyuluyor , sonra sırası ile B, C,D activity’lerini açtık diyelim. Back Stack’imize activity’ler sırası ile ekleniyor.

Back Stack sırası:

A -> B -> C -> D  (ön yüzde D activitysi var)


Yukarıdaki durumda tekrardan B activity sini açtığımız an Launch Mode standart olduğu için stackte bulunan B activity’sine bağlanmak yerine yeni activity oluşturuyor. Yani varolan instance’ı kullanmıyor yeni oluşturuyor.

A -> B -> C -> D -> B (ön yüzde B activitysi var)

Standart kullanarak bir activityden birden fazla instance oluşturabilir ve aynı Task’ta tutabilirsiniz.

2-singleTop

“singleTop” kullanmak için manifest dosyasında belirtmek gerekir. singleTop’ın standarttan farkı şudur. Eğer oluşturacağımız activity zaten stackte var ve en üstte ise tekrardan oluşturulmaz ve var olan kullanılır. Burdaki şart activity’nin en üstte olmasıdır.

Üç örnek verelim:

D activity’si oluşturalım.

Örnek 1:

D activiys’i oluşturmadan önce stack

A -> B -> C  (ön yüzde C activitysi var, D stackte yok)

D activiys’i oluşturulduktan sonra stack

A -> B -> C -> D (ön yüzde D activitysi var)

Örnek 2:

D activiys’i oluşturmadan önce stack

A -> B -> C -> D (ön yüzde D activitysi var)

D activiys’i oluşturulduktan sonra stack

A -> B -> C -> D (ön yüzde D activitysi var)

Gördüğünüz gibi en üstte D activity’si varken biz tekrardan D activity’si oluşturduk. Peki ne oldu D activity’si en tepede olduğu için tekrardan oluşturulmadı ve mevcut instance kullanıldı. Eeee peki ben yeni activity’e data aktarmam gerekiyordu nasıl yapacam derseniz bu durumda eğer onNewIntent() methodunu override ettiyseniz , onNewIntent methodu çağırılır ve datalar bu method aracılığı ile aktarılır. onNewIntent methodu hakkında daha detaylı bilgi için tıklayınız.

Örnek 3:

D activiys’i oluşturmadan önce stack

A -> B -> C -> D -> E (ön yüzde E activitysi var)

D activiys’i oluşturulduktan sonra stack

A -> B -> C -> D -> E -> D (ön yüzde D activitysi var)

D activity’si stackimizde olduğu halde en üstte olmadığı için tekrardan yeni bir instance yaratıldı ve stacke eklendi

3-singleTask

“singleTask” kullanmak için manifest dosyasında belirtmek gerekir. singleTask’ın singleTop’tan farkı şudur. Eğer oluşturacağımız activity zaten stackte var ise tekrardan oluşturulmaz ve var olan kullanılır. Burdaki activity’nin en üstte olması şartı aranmaz. Eğer activity stackte varsa yeni instance oluşturulmaz ve var olan instance kullanılır. Stack’te ondan üstte activityler varsa onlar silinir.

İki örnek verelim:

D activity’si oluşturalım.

Örnek 1:

D activiys’i oluşturmadan önce stack

A -> B -> C  (ön yüzde C activitysi var, D stackte yok)

D activiys’i oluşturulduktan sonra stack

A -> B -> C -> D (ön yüzde D activitysi var)

Örnek 2:

D activiys’i oluşturmadan önce stack

A -> B -> C -> D -> E (ön yüzde E activitysi var)

D activiys’i oluşturulduktan sonra stack

A -> B -> C -> D (ön yüzde D activitysi var)

singleTask örneğini asıl 2. örneğimizde anlayabiliriz. Stack’imizin ilk halinde D activity’si var ama en üstte değil sadece stackimizde var. Tekrardan D activity’si oluşturmaya çalıştığımız zaman stackte olduğu için direk o en üste getiriliyor ve stackte ondan üstte activity varsa onlar siliniyor (destroy ediliyor). Yine bu activiy’e data aktarmak istersek onNewIntent() metotu aracılığı ile aktarabiliriz.

4. singleInstance

“singleInstance”  singleTask’a benzesede diğerlerinden farklı bir yapıya sahiptir.  Yukarıdaki üç metottada hep aynı Task içinde çalıştık.  singleInstance kullandığımız zaman tek task değil birden fazla task kullanıyoruz. Neden böyle bir şeye ihtiyacımız olsun ki derseniz şöyle anlatayım. singleTask kullandığımız zaman Task’ımızda bir activity’den sadece bir tane olabiliyordu. Bir activity’i oluşturduğumuzda önce stackte var mı kontrol ediliyor yoksa yeni temiz bir instance oluşturuluyor ve stacke ekleniyor varsa direk o instance kullanılıyordu ve stackte onun üstünde bulunan activityler destroy ediliyordu. Diyelim ki şöyle bir ihtiyacımız var aynı singleTask’ta olduğu gibi bir activity’den sadece bir tane instance oluşabilsin ve onun üstünde olan activitylerde destroy edilmesin. İşte bu durumda oluşturulan activity mevcut tasktan farklı bir taska konuluyor.

3 örnek verelim.

Örnek 1:

D activiys’i oluşturmadan önce

Task 1 : A -> B -> C

D activiys’i oluşturulduktan sonra

Task 1: A -> B -> C

Task 2: D

Yukarıdaki örnekte gördüğünüz gibi D activity’si singleInstance ile oluşturulduğu için mevcut tasktan farklı bir taskta oluşturuldu.

Örnek 2:

D activiys’i oluşturmadan önce

Task 1: A -> B -> C

Task 2: D

D activiys’i oluşturulduktan sonra

Task 1: A -> B -> C

Task 2: D

D activity’sinin bir instance’ı zaten Task2 de olduğu için tekrar instance oluşturulmadı ve mevcut instance’ın onNewIntent metotu çağırılarak önceden oluşmuş olan instance kullanıldı.

Örnek 3:

E activiys’i oluşturmadan önce

Task 1: A -> B -> C

Task 2: D

E activiys’i oluşturulduktan sonra (E activity’si C den başlatıldığını ve LaunchMode singleInstance olarak başlatılmadığını sayalım)

Task 1: A -> B -> C -> E

Task 2: D

Yukarıda gördüğünüz gibi singleInstance ile oluşturduğumuz activity farklı bir taska koyuluyor ve diğer işlemler aynı Task üzerinden devam ediyor. Dolayısıyla E activity’sini oluşturduğumuz an Task1 e konuluyor.

Bu dersi anlamanız için Google Play’den bu uygulamayı indirip mutlaka denemelisiniz. İndirmek için tıklayınız.

Bu dersimde anlatmak istediklerim bu kadar. Umarım sizler için yararlı olmuştur. Konu hakkında soru , görüş ve yorumlarını konu altından ve ya SoruCevap sitemizden sorabilirsiniz.

Sıfırdan Android derslerimiz için tıklayınız.

Taha Kırca

iOS & Android & Apple Watch Developer, Mobilhanem.com yazarı, Karadeniz Uşağu, Ordu Sevdalısı

1 Yorum

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?