Что такое Context и зачем он?android-63

Определение Context

Context (контекст) в Android — это абстрактный класс (android.content.Context), который предоставляет доступ к информации о состоянии приложения и системе. Это фундаментальная концепция, которая связывает компоненты приложения с Android-системой.

Основные функции Context:

  1. Доступ к ресурсам (строкам, изображениям, цветам и т.д.)
  2. Создание компонентов (Activity, Service, BroadcastReceiver)
  3. Работа с системными сервисами (LocationManager, Vibrator и др.)
  4. Управление файлами и SharedPreferences
  5. Запуск Activity и других компонентов

Виды Context

В Android есть несколько реализаций Context:

1. Application Context

Получается через getApplicationContext(). Живет все время работы приложения.

val appContext = applicationContext

Когда использовать:

  • Для долгоживущих операций, не привязанных к UI
  • При работе с Singleton
  • Для доступа к ресурсам вне Activity

2. Activity Context

Получается через this в Activity. Привязан к жизненному циклу Activity.

class MainActivity : AppCompatActivity() {
    val activityContext = this
}

Когда использовать:

  • Для работы с UI (создание View, Toast, Dialog)
  • Когда нужен Context, привязанный к конкретному экрану

3. Service Context

Аналогичен Application Context, но привязан к жизненному циклу Service.

Разница между Application и Activity Context

Характеристика Application Context Activity Context
Время жизниВсе приложениеТолько жизнь Activity
Доступ к UIНетДа
ThemeБез темыС учетом темы Activity
ДиалогиНельзя показыватьМожно показывать

Опасности при работе с Context

  1. Утечки памяти:
// Плохо: Activity не сможет быть собрана GC
class Singleton {
    companion object {
        var context: Context? = null
    }
}

// Лучше:
class Singleton(val appContext: Context) {
    init {
        this.appContext = appContext.applicationContext
    }
}
  1. Использование не того Context:
  • Показ Toast с Application Context
  • Создание Dialog с Application Context

Практические примеры использования

  1. Доступ к ресурсам:
val appName = context.getString(R.string.app_name)
  1. Запуск Activity:
val intent = Intent(context, MainActivity::class.java)
context.startActivity(intent)
  1. Работа с SharedPreferences:
val prefs = context.getSharedPreferences("my_prefs", Context.MODE_PRIVATE)
  1. Доступ к системным сервисам:
val vibrator = context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator

Резюмируем

  • Context — это "мост" между компонентами приложения и Android-системой
  • Основные виды: Application, Activity и Service Context
  • Application Context живет дольше, но не имеет доступа к UI
  • Activity Context привязан к жизненному циклу экрана
  • Важно избегать утечек памяти и правильно выбирать тип Context