Разница между getContext (), getApplicationContext (), getBaseContext () и "this"
В чем разница между getContext(),getApplicationContext(),getBaseContext() , и "this"?
хотя это простой вопрос, я не могу понять основную разницу между ними. Пожалуйста, приведите несколько простых примеров, если это возможно.
8 ответов:
View.getContext(): возвращает контекст в данный момент работает. Обычно в настоящее время активная деятельность.
Activity.getApplicationContext(): возвращает контекст для всего приложения (процесс все действия выполняются внутри из.) Используйте это вместо текущего контекста действия, если вам нужен контекст, связанный с жизненным циклом всего приложения, а не только текущий Деятельность.
ContextWrapper.getBaseContext(): Если вам нужен доступ к контексту из другого контекста, вы используете ContextWrapper. Этот Контекст, на который ссылаются изнутри, что ContextWrapper доступен через getBaseContext().
большинство ответов уже крышка
getContext()иgetApplicationContext()но getBaseContext() редко говорят.метод
getBaseContext()актуален только тогда, когда у вас естьContextWrapper. Android предоставляетContextWrapperкласс, который создается вокруг существующегоContextиспользование:ContextWrapper wrapper = new ContextWrapper(context);преимущества использования
ContextWrapperэто позволяет вам "изменять поведение без изменения исходного контекста". Например, если у вас есть действие под названиемmyActivityзатем может создатьViewС другой темой, чемmyActivity:ContextWrapper customTheme = new ContextWrapper(myActivity) { @Override public Resources.Theme getTheme() { return someTheme; } } View myView = new MyView(customTheme);
ContextWrapperдействительно мощный, потому что он позволяет переопределить большинство функций, предоставляемыхContextвключая код доступа к ресурсам (например,openFileInput(),getString()), взаимодействовать с другими компонентами (например,sendBroadcast(),registerReceiver()), просит разрешения (например,checkCallingOrSelfPermission()) и разрешение расположения файловой системы (например,getFilesDir()).ContextWrapperдействительно полезно для решения проблем, связанных с устройством/версией, или для применения одноразовых настроек такие компоненты, как представления, требующие контекста.метод getBaseContext() может использоваться для доступа к" базовому " контексту, что
ContextWrapperобтекает. Вам может потребоваться доступ к" базовому " контексту, если вам нужно, например, проверить, является ли этоService,ActivityилиApplication:public class CustomToast { public void makeText(Context context, int resId, int duration) { while (context instanceof ContextWrapper) { context = context.baseContext(); } if (context instanceof Service)) { throw new RuntimeException("Cannot call this from a service"); } ... } }или если вам нужно вызвать "развернутую" версию метода:
class MyCustomWrapper extends ContextWrapper { @Override public Drawable getWallpaper() { if (BuildInfo.DEBUG) { return mDebugBackground; } else { return getBaseContext().getWallpaper(); } } }
getApplicationContext() - возвращает контекст для всех действий, выполняемых в приложении.
getBaseContext() - Если вы хотите получить доступ к контексту из другого контекста в приложении вы можете получить доступ.
getContext () - возвращает контекстное представление только текущей текущей активности.
Contextсодержит сведения оActvityилиApplicationдля вновь созданных компонентов.соответствующей
Contextдолжны быть предоставлены вновь созданные компоненты (будь то контекст приложения или контекст действия)С
Activityявляется наследникомContextможно использоватьthisчтобы получить контекст этой деятельности
вопрос "Что такое контекст" является одним из самых сложных вопросов в Android Вселенной.
контекст определяет методы, которые обращаются к системным ресурсам, извлекают статические активы приложения, проверяют разрешения, выполняют манипуляции с пользовательским интерфейсом и многое другое. В сущности,
Contextявляется примером анти-паттерна объекта Бога в производстве.когда дело доходит до какой
Contextдолжны ли мы использовать, это становится очень сложным, потому что, кроме того, чтобы быть объектом Бога, иерархическое деревоContextподклассы грубо нарушают принцип подстановки Лискова.этот блог попытки уплотнить!--1--> применимость классов в различных ситуациях.
позвольте мне скопировать основную таблицу из этого сообщения для полноты:
+----------------------------+-------------+----------+---------+-----------------+-------------------+ | | Application | Activity | Service | ContentProvider | BroadcastReceiver | +----------------------------+-------------+----------+---------+-----------------+-------------------+ | Show a Dialog | NO | YES | NO | NO | NO | | Start an Activity | NO¹ | YES | NO¹ | NO¹ | NO¹ | | Layout Inflation | NO² | YES | NO² | NO² | NO² | | Start a Service | YES | YES | YES | YES | YES | | Bind to a Service | YES | YES | YES | YES | NO | | Send a Broadcast | YES | YES | YES | YES | YES | | Register BroadcastReceiver | YES | YES | YES | YES | NO³ | | Load Resource Values | YES | YES | YES | YES | YES | +----------------------------+-------------+----------+---------+-----------------+-------------------+
- приложение может начать работу отсюда, но для этого необходимо создать новую задачу. Это может соответствовать конкретным случаям использования, но может создавать нестандартные задняя стека в вашем приложении и, как правило, не рекомендуется и не считается хорошей практикой.
- это законно, но инфляция будет сделано с темой по умолчанию для системы, на которой вы работаете, не то, что определено в приложении.
- разрешено, если приемник имеет значение null, которое используется для получения текущего значения липкой трансляции, на Android 4.2 и выше.
отсюда docs
Я понял, что вы должны использовать:
попробуйте использовать контекст приложения, а не в контексте-активность
