Nisa Efendioğlu

Android Launch Mode

Profile picture

Nisa Efendioğlu

Post Image

Herkese merhabalar,

Bugün sizlere android'de bulunan Launch Mode konusundan bahsedeceğim. Hazırsanız başlayalım. 🥳

Launch Mode

Launch mode, activity’i başlatma yöntemidir. Activity başlarken yeni bir instance mı oluşacak yoksa daha öncesinden oluşmuş olan instance'a mı bağlanacak gibi durumların kontrolünü Launch Mode ile ayarlayabiliriz.

Android’de 4 adet Launch Mode bulunmaktadır. Bunlar;

✨ standart

✨ singleTop

✨ singleTask

✨ singleInstance

Bu launch modeları AndroidManifest dosyamız içerisine ekleyerek kullanabiliriz. Örnek kullanım :

image

Başlıkları teker teker ele almadan önce ufak bir bilgi olarak Task nedir'i açıklamaya koyulayım.

Task Nedir? 👀

Oluşturulan activity'ler bir collection'da (stack) tutulur. Biz activityler oluşturdukça bu oluşan activity'ler stack içerisinde tutulur. Stack ise, son giren ilk çıkar mantığındaki bir LIFO veri yapısıdır. Daha açık yoldan anlatmak istersek, örneğin bir uygulamamız var ve bu uygulama içerisinde activity'i sonlandırmadan sırasıyla, hesap > profil > ayarlar alanına geçtik. Geri tuşuna bastığımızda ayarlar alanından profil alanına geçiş yapacağız. Yani son açılan ekran ilk olarak geri alınır. Android'de bahsettiğimiz bu stack işlemi Back Stack olarak adlandırılır.

Activity'lerin bir Back Stack'e eklenmesini, silinmesini o an hangi activity'nin gösterileceğini ise Task gerçekleştirir.

Tekrar dönelim konumuza. Nedir bu launch mode'lar? Hangi durumda hangi launch mode'u kullanmalıyız?

☘️ standart

image

standart default olarak tanımlanmış launch mode'dur. Yani, AndroidManifest dosyamız içerisinde herhangi bir launch mode tanımlaması yapmasak dahi varsayılan olarak standart launch mode'u kullanılır.

Peki nedir bu standart?

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

Back Stack sırası:

A -> B -> C -> D (ekranda 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şturur. Yani varolan instance'ı kullanmak yerine yeniden yaratarak onu ekrana sunar.

A -> B -> C -> D -> B (ekranda B activitysi var)

Standart kullanarak bir activityden birden fazla instance oluşturabilir ve aynı Task içerisinde tutabilirsiniz.

☘️ singleTop

image

Eğer oluşturacağımız activity zaten stackte var ve mevcut ana ekranda ise tekrardan oluşturulmaz ve var olan kullanılır. Örneğin,

Back Stack sırası: A -> B -> C -> D (ekranda D activitysi var)

Ekranda D activity'si varken kullanıcı tekrardan D activity'sine yönlendiren butona tıkladı bu durumda D activity'si

A -> B -> C -> D -> D bu şekilde tekrardan oluşmak yerine mevcut olan D activity'sini kullanılır. Yani görünüm bu şekildedir : A -> B -> C -> D

D activity’si en tepede olduğu için tekrardan oluşturulmadı ve mevcut instance kullanıldı. Buradaki şart activtity'nin en üstte olmasıdır. D activity'si en üst katmanda olmasa idi yeni bir instance yaratılacaktı. Bir örnek üzerinden bakalım,

A -> B -> C -> D (ekranda D activitysi var)

sonrasında D activity'sinden E activity'sine geçi yaptık.

A -> B -> C -> D -> E (ekranda E activitysi var)

E activity'si üzerinden D activity'sine geçiş yapmak istiyoruz fakat en üst katmanda, yani ekranımızda E activity'si var. Bu durumda D activity'si için yeni bir instance yaratılır ve stack içerisine eklenir.

A -> B -> C -> D -> E -> D (ekranda D activitysi var)

☘️ singleTask

image

Activity zaten stackte var ise tekrardan oluşturulmaz ve var olan kullanılır. Burada singleTop modundaki gibi, activity’nin en üstte olması şartı aranmaz. singleTop modu için kullandığımız örneği singleTask kullanarak gerçekleyelim.

Back Stack sırası: A -> B -> C -> D (ekranda D activitysi var)

Ekranda D activity'si varken kullanıcı tekrardan D activity'sine yönlendiren butona tıkladı bu durumda D activity'si

A -> B -> C -> D -> D bu şekilde tekrardan oluşmak yerine mevcut olan D activity'sini kullanılır. Yani görünüm bu şekildedir : A -> B -> C -> D

D activity'si en üst katmanda olmasa idi yine var olan instance kullanılacaktı. Bir örnek üzerinden bakalım,

A -> B -> C -> D (ekranda D activitysi var)

sonrasında D activity'sinden E activity'sine geçi yaptık.

A -> B -> C -> D -> E (ekranda E activitysi var)

E activity'si üzerinden D activity'sine geçiş yapmak istiyoruz fakat en üst katmanda, yani ekranımızda E activity'si var. Bu durumda D activity'si için yeni bir instance yaratılmaz ve stack içerisinde var olan D activity'sine geçiş yapılır. Açılacak activity'nin kendisi üzerindeki actiivty'ler stack üzerinden silinir. (E activity'si stackten silindi.)

A -> B -> C -> D (ekranda D activitysi var)

☘️ singleInstance

image

singleInstance, singleTask'a benzer ancak diğer launch modelardan farklı bir yapıya sahiptir. Yukarıdaki üç yöntem her zaman aynı task üzerinde çalışır. singleInstance kullanırken, tek bir task yerine birden çok task kullanılır. Peki neden birden fazla task'a ihtiyacımız olsun ki?

Bir activity'i oluşturduğumuzda önce stackte var mı kontrol edilir. Stack'te yoksa yeni bir instance oluşturulur ve stack içerisine eklenir, varsa direkt o instance kullanılır ve stackte onun üstünde bulunan activityler destroy edilir.

Varsayalım ki şöyle bir ihtiyacımız var, singleTask modunda olduğu gibi bir activity'den sadece bir tane instance oluşabilsin ve onun üstünde olan activity'lerde destroy edilmesin. İşte bu gibi durumlarda oluşturulan activity mevcut tasktan farklı bir taska eklenir. Örnek üzerinden bakalım,

D activity'si oluşturmadan önce :

Task 1 : A -> B -> C

D activity'si 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 activity'si oluşturmadan önce :

Task 1: A -> B -> C

Task 2: D

D activity'si 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 activity'si oluşturulmadan önce :

Task 1: A -> B -> C

Task 2: D

E activity'si 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

Umarım konuyu size anlatabilmişimdir. Sorularınızı bağlantılı hesaplarımdan sorabilirsiniz. Bir sonraki yazımda görüşmek üzere!

Keyifli kodlamalar. 🥳

Go back