Context, Android uygulama geliştirmenin önemli yapı taşları arasında yer almaktadır. Context ile uygulamanın bağlamı ve diğer componentlerle iletişimi sağlanabilir.
Android’de kullanılan birden fazla Context vardır. Bu yapının nasıl kullanıldığı ve nerede kullanılacağı çoğu geliştirici tarafından tam olarak bilinmez ve bu durum memory leak gibi bazı problemlere yol açabilir.
Context Nedir?
Context, uygulama ortamı hakkında genel bilgilere ulaşan, diğer componentlerle iletişim sağlayabilen bir arayüzdür.
Context 3 farklı şekilde kullanılabilir.
- Yeni bir aktivite başlatmak
- Kaynakları yüklemek
- Layoutları infilate etmek
Context Tipleri
Context, Android componentinin nerede kullanıldığına göre değişen bir yapıya sahiptir. UI ile ilişkili olabilir, kısa ve uzun yaşam döngüsüne sahip olabilir. Şimdi bu context tiplerini inceleyelim.
Application
Application classı Contexti içerir. Buradaki context singleton olarak tanımlanmıştır yani her çağırdığınızda aynı instance verilecektir. Application Context tüm uygulamanın lifecycle na bağlıdır ve uzun bir yaşam döngüsüne sahiptir. Bir diğer önemli detay ise bu contextin UI ile ilişkili olmadığıdır yani bu context theme hakkında bir bilgi içermez. Bundan dolayı bu context ile XML inflate yapamazsınız.
Application Context’i getApplicationContext()
metodu ile çağırabilirsiniz.
Kullanacağınız object Activity veya Service ötesinde ise Application Context kullanın. Diğer durumda memory leak ile karşılaşmanız kaçınılmaz olacaktır. Üstte bahsettiğim gibi bu context UI ile ilişkili olmadığından UI işlemlerinde bu contexti kullanmaktan kaçının.
Bununla alakalı bir örneği inceleyelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class UsersDatabase : RoomDatabase() { @Volatile private var INSTANCE: UsersDatabase? = null fun getInstance(context: Context): UsersDatabase = INSTANCE ?: synchronized(this) { INSTANCE ?: buildDatabase(context).also { INSTANCE = it } } private fun buildDatabase(context: Context) = Room.databaseBuilder( context.applicationContext, UsersDatabase::class.java, "Sample.db" ).build() } } |
Gördüğünüz gibi Room DB ile tüm uygulamada etkin olacak bir instance oluşturduğumuz için burada Application Context kullandık.
Activity
Activity’ler de içerisinde Context barındırır. Bu context Activity lifecycle bağımlıdır. Bu yüzden sadece Activity içerisinde kullanılmalıdır. Bu Context, ContextThemeWrapper classını kullanır. Yani Context + Theme’dir. Bununla beraber XML inflate işlemi bu context ile yapılabilir.
Activity ya da Fragment içerisinde bu contexte getContext()
ya da this
ile ulaşılabilir.
Activity Context, layout inflate, dialog show, get resource ve bir başka activity başlatmak için kullanılabilir.
Service
Service’lerde context barındırır. Ancak bu context UI ile ilişkili değildir ve Service lifecycle bağlıdır.
BroadCastReceiver
BroadCastReceiver bir context içermez ama gelen her event için onReceive()
metodu içindeki contexti alır. Yine bu context UI ile ilişkili değildir ve kısa bir yaşam döngüsüne sahiptir.
ContentProvider
ContextProvider da bir context içermez Android frameworku oluşturulduğunda ContentProvider için bir app context sağlar. Bu nedenle kullanımı Application Context ile aynıdır.
Evet artık Context ile alakalı bilgilere sahipsiniz ve nerede nasıl kullanılacağını biliyorsunuz. Tek kaçınmanız gereken nokta memory leak ler.
https://developer.android.com/reference/android/content/Context
https://developer.android.com/reference/android/view/ContextThemeWrapper