В чем разница между getContext()
, getApplicationContext()
, getBaseContext()
и " this
«?
Хотя это простой вопрос, я не могу понять принципиальную разницу между ними. Пожалуйста, приведите несколько простых примеров, если это возможно.
android
this
android-context
iCurious
источник
источник
Ответы:
View.getContext()
Возвращает контекст, в котором в данный момент выполняется представление. Обычно текущая активная активность.Activity.getApplicationContext()
Возвращает контекст для всего приложения (процесс, внутри которого выполняются все действия). Используйте это вместо текущего контекста Activity, если вам нужен контекст, связанный с жизненным циклом всего приложения, а не только с текущим Activity.ContextWrapper.getBaseContext()
: Если вам нужен доступ к контексту из другого контекста, вы используете ContextWrapper. Контекст, на который ссылается внутри этого ContextWrapper, доступен через getBaseContext ().источник
this
иgetContext()
не всегда одинаковы, например, в классе Activity, вы можете использовать,this
потому чтоActivity
наследует,Context
но методgetContext()
не вActivity
классе. @mikedroid @KCRajuБольшинство ответов уже охватывают
getContext()
иgetApplicationContext()
но getBaseContext () редко объяснено.Метод
getBaseContext()
актуален только тогда, когда у вас естьContextWrapper
. Android предоставляетContextWrapper
класс, который создается сContext
использованием существующего :Преимущество использования a
ContextWrapper
заключается в том, что он позволяет «изменять поведение без изменения исходного контекста». Например, если вы называете действие,myActivity
можете создатьView
тему с другой темой, чемmyActivity
:ContextWrapper
действительно мощный, потому что он позволяет вам переопределить большинство функций, предоставляемыхContext
включением кода для доступа к ресурсам (напримерopenFileInput()
,getString()
), взаимодействия с другими компонентами (напримерsendBroadcast()
,registerReceiver()
), запроса разрешений (напримерcheckCallingOrSelfPermission()
) и разрешения местоположений файловой системы (напримерgetFilesDir()
).ContextWrapper
действительно полезно для обхода проблем, связанных с устройством / версией, или для одноразовой настройки таких компонентов, как представления, для которых требуется контекст.Метод getBaseContext () может использоваться для доступа к «базовому» контексту, который
ContextWrapper
оборачивается. Вы , возможно , потребуется доступ к «базовой» контекст , если вам нужно, например, проверить , является ли этоService
,Activity
илиApplication
:Или, если вам нужно вызвать «развернутую» версию метода:
источник
ContextWrapper
- одно из худших решений, когда-либо принятых разработчиками платформы Android. Когда они поняли, что создали целое семейство Объектов Бога, вместо того, чтобы делать правильные вещи и рефакторинг кода в сторону Единой Ответственности, они добавили уродливый хак, который позволил изменить поведение контекста путем углубления дерева наследования. Плохая программная инженерия в самом уродливом виде. Что касается нас, разработчиков, ИМХО , никто никогда не должен использоватьgetBaseContext()
илиContextWrapper
. Если вы делаете - это огромный «кодовый запах».CustomToast
код. ) : ))))))источник
Вопрос «что такое контекст» является одним из самых сложных вопросов во вселенной Android.
Контекст определяет методы, которые обращаются к системным ресурсам, извлекают статические активы приложения, проверяют разрешения, выполняют манипуляции с пользовательским интерфейсом и многое другое. По сути,
Context
это пример анти-паттерна God Object в производстве.Когда дело доходит до того, какой тип
Context
мы должны использовать, это становится очень сложным, потому что, кроме того, что он является Объектом Бога, дерево иерархииContext
подклассов грубо нарушает Принцип Подстановки Лискова.Этот пост в блоге пытается обобщить
Context
применимость классов в различных ситуациях.Позвольте мне скопировать основную таблицу из этого поста для полноты:
источник
Context
предоставляет информацию оActvity
илиApplication
только что созданным компонентам.Соответствующее
Context
должно быть предоставлено вновь созданным компонентам (будь то контекст приложения или контекст действия)Так
Activity
как это подклассContext
, можно использовать,this
чтобы получить контекст этой деятельностиисточник
Из этой документации
Я понял, что вы должны использовать:
источник
getApplicationContext ()
getContext () и getBaseContext ()
это
источник
А
Context
это:источник