Иногда в пользовательском классе требуется получить доступ к контексту приложения.
Можно использовать метод внедрения зависимостей, но именно для этой задачи мне нравится подход с использованием статического хранилища.
Идея заключается в том, чтобы расширить класс android.app.Application статическим полем context, куда мы будем сохранять ссылку на Application при создании экземпляра класса.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package com.myApp.utils import android.app.Application import android.content.Context class App : Application() { override fun onCreate() { super.onCreate() context = this } companion object { var context: Context? = null private set } } |
Чтобы эта конструкция заработала, необходимо указать явно имя нового класса в манифесте (AndroidManifest.xml).
В секцию application добавим свойство android:name
1 2 3 4 5 6 7 8 9 |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.myapp.packagename"> <application android:name="com.myApp.utils.App" android:allowBackup="true" ... |
С этого момента вы можете получить контекст приложения в любом месте/классе вашего приложения. Например, чтобы вывести сообщение через Toast :
1 2 3 4 |
val ctx = App.context ctx?.apply { Toast.makeText(this, this.getString(R.string.my_message), Toast.LENGTH_LONG).show() } |