Разница между getContext (), getApplicationContext (), getBaseContext () и “this”
В чем разница между getContext()
, getApplicationContext()
, getBaseContext()
и « this
»?
Хотя это простой вопрос, я не могу понять основную разницу между ними. Если возможно, приведите несколько простых примеров.
- Когда «жирная стрелка» (=>) привязывается к «этому» экземпляру
- Почему мы не можем использовать это ключевое слово в статическом методе
- В чем разница между «$ (this)» и «this»?
- std :: shared_ptr этого
- Управление значением «this» в событии jQuery
- Когда следует использовать «это» в classе?
- Может ли «это» когда-либо быть пустым в Java?
- 'this' vs $ scope в controllerах AngularJS
- this: Невозможно использовать это в статическом контексте
- Разница между $ (this) и этим в jquery
- В чем разница между этим и Activity.this
- Когда вызывать контекст активности или контекст приложения?
- jQuery: исключить $ (this) из селектора
-
View.getContext()
: возвращает контекст, в котором в настоящее время выполняется представление. Обычно активна в настоящий момент. -
Activity.getApplicationContext()
: возвращает контекст для всего приложения (процесс, в котором все действия запущены внутри). Используйте это вместо текущего контекста Activity, если вам нужен контекст, привязанный к жизненному циклу всего приложения, а не только текущая активность. -
ContextWrapper.getBaseContext()
: если вам нужен доступ к контексту из другого контекста, вы используете ContextWrapper. Контекст, на который ссылается изнутри, что ContextWrapper доступен через getBaseContext ().
Большинство ответов уже охватывают getContext()
и getApplicationContext()
но getBaseContext () редко объясняется.
Метод getBaseContext()
применим только в том случае, если у вас есть ContextWrapper
. Android предоставляет class ContextWrapper
, созданный вокруг существующего Context
используя:
ContextWrapper wrapper = new ContextWrapper(context);
Преимущество использования ContextWrapper
заключается в том, что он позволяет вам «изменять поведение без изменения исходного контекста». Например, если у вас есть активность под названием myActivity
тогда вы можете создать представление с другой темой, чем 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
является подclassом Context
, его можно использовать для получения контекста активности
Вопрос «что такое контекст» является одним из самых сложных вопросов в Android-юниверсе.
Контекст определяет методы доступа к системным ресурсам, получения статических активов приложения, проверки разрешений, выполнения манипуляций пользовательского интерфейса и многих других. По сути, Context
является примером анти-шаблона Бога-объекта в производстве.
Когда дело доходит до того, какой тип Context
мы должны использовать, он становится очень сложным, потому что, за исключением объекта God Object, дерево иерархии подclassов Context
жестоко нарушает принцип замещения Лискова.
Это сообщение в блоге пытается обобщить применимость classов Context
в разных ситуациях.
Позвольте мне скопировать основную таблицу из этой публикации для полноты:
+----------------------------+-------------+----------+---------+-----------------+-------------------+ | | 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 и выше.
– скриншот
Часть UML-диаграммы контекста
Из этих документов
Я понял, что вы должны использовать:
Попробуйте использовать контекстное приложение вместо контекстной активности
getApplicationContext ()
это используется для уровня приложения и относится ко всем видам деятельности.
getContext () и getBaseContext ()
это, скорее всего, одно и то же. В этом выражается только текущая деятельность, которая является живой.
это
всегда ссылается на текущий объект classа.