Каковы существенные различия между методами getContext()
, getApplicationContext()
, getBaseContext()
и this
для получения контекста Android
?
Я знаю, что это может быть очень тривиальный или очень широкий вопрос, но я думаю, что многие из нас не совсем понимают эти концепции, и я думаю, что это очень поможет сообществу. Кроме того, если возможно, они могут привести несколько основных примеров использования каждого падежа, чтобы улучшить свое понимание.
PS: this
я имею в виду в пределах Activity
.
getContext() Возвращает контекст, в котором выполняется представление, обычно Activity, через этот контекст можно получить доступ к текущей теме, ресурсам и т. д.
getApplicationContext() Возвращает контекст единственного глобального объекта Application текущего процесса. Использование этого контекста гарантирует, что у вас есть контекст, привязанный к жизненному циклу приложения. Можно сказать, что это самый «легкий» контекст.
getBaseContext() : базовый контекст, установленный конструктором или setBaseContext. Чтобы поговорить об этом контексте, необходимо поговорить о ContextWrapper , который является классом, через который можно получить доступ к одному контексту внутри другого. Контекст, на который ссылается ContextWrapper , получается через getBaseContext() . Получение контекста с помощью этого метода связано с контекстом Activity.
This : Эта ссылка может использоваться в Activity, поскольку Activity наследуется от
Context
контекста Activity и является ссылкой на него:Поскольку ваш класс не расширяется от
Activity
илиAppCompactActivity
даже отService
(где он используетсяthis
для получения контекста), если ваш класс не расширяет ни один из них, вы должны отправить своему классу контекст с помощью конструктора.Пример:
Используется
getApplicationContext()
для получения контекста, связанного с приложением, поэтому он всегда будет одинаковым на протяжении всего жизненного цикла приложения. С другой стороны,getBaseContext()
он связан с родительской активностью и не обязательно будет таким же, поскольку он привязан к своему жизненному циклу, поэтому его можно уничтожить.Таким образом, у вас может быть только 2 типа контекста: один на основе приложения, а другой на основе действия, поэтому в зависимости от требований вы должны использовать тот или иной.
Когда вы делаете
this
внутри Activity то, что вы на самом деле делаете, это берете объектActivity
своей активности, а из этого Android уже берет контекст. Один из способов проверки заключается в следующем:Давайте попробуем вызвать метод
getLayoutInflater()
внутри вашей активности:Вы увидите, что with
context.getLayoutInflater();
дает вам ошибку, потому что этот метод нужно вызывать с объектом,Activity
а не с файломContext
.