В программировании на Android что такое класс Context
и для чего он используется?
Я читал об этом на сайте разработчика, но не могу понять это ясно.
В программировании на Android что такое класс Context
и для чего он используется?
Я читал об этом на сайте разработчика, но не могу понять это ясно.
Проще говоря:
Как следует из названия, это контекст текущего состояния приложения/объекта. Это позволяет вновь созданным объектам понять, что происходит. Обычно вы вызываете его, чтобы получить информацию о другой части вашей программы (активность и пакет/приложение).
Вы можете получить контекст, вызвав getApplicationContext()
, getContext()
, getBaseContext()
или this
(когда в классе, который простирается от Context
, например, класса Application, Activity, Service и IntentService).
Типичное использование контекста:
Создание новых объектов: Создание новых представлений, адаптеров, слушателей:
TextView tv = new TextView(getContext());
ListAdapter adapter = new SimpleCursorAdapter(getApplicationContext(), ...);
Доступ к стандартным общим ресурсам: Такие службы, как LAYOUT_INFLATER_SERVICE, SharedPreferences:
context.getSystemService(LAYOUT_INFLATER_SERVICE)
getApplicationContext().getSharedPreferences(*name*, *mode*);
Доступ к компонентам неявно: Что касается контент-провайдеров, трансляций, намерений
getApplicationContext().getContentResolver().query(uri, ...);
Представьте себе, что Person-X является генеральным директором начинающей софтверной компании.
В компании присутствует ведущий архитектор, этот ведущий архитектор выполняет всю работу в компании, такую как базы данных, пользовательский интерфейс и т.д.
Теперь генеральный директор нанимает нового разработчика.
Именно Архитектор сообщает об ответственности вновь нанятого сотрудника, основываясь на навыках нового человека, независимо от того, будет ли он работать над базой данных, пользовательским интерфейсом и т.д.
Это как доступ активности андроида к ресурсу приложения.
Это похоже на то, когда вы посещаете отель, вы хотите завтракать, обедать и ужинать в подходящее время, верно?
Есть много других вещей, которые вам нравятся во время пребывания. Как вы получаете эти вещи?
Вы просите служащего обслуживания номеров принести эти вещи для вас.
Здесь обслуживающий персонал - это контекст, считающий, что вы - единственное занятие, а отель - ваше приложение, и, наконец, завтрак, обед и ужин должны быть ресурсами.
Вещи, которые включают контекст:
Еще один способ описать это: Рассматривать контекст как удаленный от телевидения и канала в телевидении ресурсы, услуги, использование намерений и т.д. - - - Здесь удаленный доступ действует как доступ для получения доступа ко всем различным ресурсам на переднем плане.
Таким образом, Remote имеет доступ к таким каналам, как ресурсы, услуги, использование намерений и т.д.
Аналогично... Тот, кто имеет доступ к удаленному, естественно, имеет доступ ко всем вещам, таким как ресурсы, услуги, использование намерений и т.д.
Различные методы, с помощью которых вы можете получить контекст
getApplicationContext()
getContext()
getBaseContext()
this
(когда в классе деятельности)Пример:
TextView TV=new TextView(this);
this
→ относится к контексту текущей деятельности.
Тема контекста в Android, кажется, многих сбивает с толку. Люди просто знают, что контекст необходим довольно часто для выполнения основных задач в Android. Люди иногда впадают в панику, потому что они пытаются выполнить какую-то операцию, которая требует контекста, и они не знают, как "получить" правильный контекст. Я собираюсь попытаться демистифицировать идею контекста в Android. Полное рассмотрение проблемы выходит за рамки этого поста, но я постараюсь дать общий обзор, чтобы у вас было представление о том, что такое контекст и как его использовать. Чтобы понять, что такое контекст, давайте взглянем на исходный код:
Что такое контекст?
Ну, сама документация дает довольно простое объяснение: класс Context - это "Интерфейс для глобальной информации о среде приложения".
Сам класс Context объявлен как абстрактный класс, реализация которого обеспечивается ОС Android. В документации также указывается, что Context "… предоставляет доступ к ресурсам и классам, относящимся к конкретному приложению, а также к дополнительным вызовам для операций на уровне приложения, таких как действия по запуску, передача и прием и т.д.".
Теперь вы можете очень хорошо понять, почему имя называется Context. Это потому что это просто так. Контекст предоставляет ссылку или ловушку, если хотите, для Действия, Сервиса или любого другого компонента, тем самым связывая его с системой, обеспечивая доступ к глобальной среде приложения. Другими словами: Контекст дает ответ на вопрос о компонентах: "Где я, черт возьми, по отношению к приложению в целом и как я могу получить доступ к общему приложению/общаться с ним?" Если все это немного сбивает с толку, быстрый взгляд на методы, предоставляемые классом Context, дает некоторые дополнительные сведения о его истинной природе.
Вот случайная выборка этих методов:
getAssets()
getResources()
getPackageManager()
getString()
getSharedPrefsFile()
Что общего у всех этих методов? Все они позволяют любому, кто имеет доступ к контексту, иметь доступ к ресурсам всего приложения.
Иными словами, контекст подключает компонент, имеющий ссылку на него, к остальной части среды приложения. Активы (например, папка think/assets в вашем проекте) доступны во всем приложении при условии, что Activity, Сервис или кто-либо еще знает, как получить доступ к этим ресурсам.
То же самое касается getResources()
, который позволяет делать такие вещи, как getResources().getColor()
, который подключит вас к ресурсу colors.xml
(не говоря уже о том, что aapt обеспечивает доступ к ресурсам через код Java, это отдельная проблема).
В результате, Context
обеспечивает доступ к системным ресурсам и их компонентам для "большего приложения".
Давайте посмотрим на подклассы Context
, классы, которые обеспечивают реализацию абстрактного класса Context
.
Наиболее очевидным классом является класс Activity
. Activity
наследуется от ContextThemeWrapper
, который наследуется от ContextWrapper
, который наследуется от самого Context
.
На эти классы полезно взглянуть, чтобы понять вещи на более глубоком уровне, но пока достаточно знать, что ContextThemeWrapper
и ContextWrapper
в значительной степени похожи на то, как они звучат.
Они реализуют абстрактные элементы самого класса Context
, "оборачивая" контекст (фактический контекст) и делегируя эти функции этому контексту.
Полезен пример - в классе ContextWrapper
абстрактный метод getAssets
из класса Context
реализован следующим образом:
@Override
public AssetManager getAssets() {
return mBase.getAssets();
}
mBase
- это просто поле, заданное конструктором для определенного контекста.
Таким образом, контекст переносится, и ContextWrapper
делегирует свою реализацию метода getAssets этому контексту. Давайте вернемся к рассмотрению класса Activity
, который в конечном счете наследуется от Context
, чтобы увидеть, как все это работает.
Вы, вероятно, знаете, что такое "Активность", но для ознакомления - это "единственная вещь, которую может сделать пользователь. Он заботится о предоставлении окна для размещения пользовательского интерфейса, с которым взаимодействует пользователь ".
Разработчики, знакомые с другими API и даже не разработчики, могли бы воспринимать это как "экран". Это технически неточно, но это не имеет значения для наших целей. Так как же взаимодействуют Activity
и Context
и что конкретно происходит в их отношениях наследования?
Опять же, полезно взглянуть на конкретные примеры. Мы все знаем, как начать деятельность. При условии, что у вас есть "контекст", из которого вы запускаете действие, вы просто вызываете startActivity(intent)
, где Intent описывает контекст, из которого вы запускаете действие, и действие, которое вы хотели бы запустить. Это знакомый startActivity(this, SomeOtherActivity.class)
.
А что такое this
? this
- это ваша активность, потому что класс Activity
наследуется от Context
. Полный цикл выглядит так: когда вы вызываете startActivity
, в конечном итоге класс Activity
выполняет что-то вроде этого:
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode);
Таким образом, он использует execStartActivity
из класса Instrumentation
(фактически из внутреннего класса в Instrumentation
, называемого ActivityResult
).
В этот момент мы начинаем изучать внутреннюю систему.
Это где ОС на самом деле обрабатывает все. Так, как Инструментарий точно начинает Деятельность? Итак, параметр this
в методе execStartActivity
выше - это ваша активность, то есть контекст, и execStartActivity
использует этот контекст.
Обзор 30 000 заключается в следующем: класс Instrumentation отслеживает список операций, которые он отслеживает для выполнения своей работы. Этот список используется для координации всех действий и обеспечения бесперебойной работы потока операций.
Есть некоторые операции, которые я не полностью изучил, для координации потока и проблем процесса. В конечном счете, ActivityResult
использует собственную операцию - ActivityManagerNative.getDefault().startActivity()
, которая использует Context
, который вы передали, когда вызывали startActivity
. Контекст, который вы передали, используется для помощи в "намеренном разрешении", если это необходимо. Умышленное разрешение - это процесс, с помощью которого система может определить цель намерения, если оно не предоставлено. (Ознакомьтесь с руководством для получения более подробной информации).
И для того, чтобы Android мог это сделать, ему необходим доступ к информации, предоставленной Context
. В частности, система должна иметь доступ к ContentResolver
, чтобы она могла "определить MIME-тип данных о намерениях".
Весь этот бит о том, как startActivity
использует контекст, был немного сложным, и я сам не до конца понимаю внутренности. Моя основная цель состояла в том, чтобы просто показать, как нужно обращаться к ресурсам всего приложения, чтобы выполнять многие операции, которые важны для приложения. Context
- это то, что обеспечивает доступ к этим ресурсам.
Более простой пример может быть Views. Мы все знаем, что вы создаете пользовательский вид, расширяя RelativeLayout
или какой-либо другой класс View
, вы должны предоставить конструктор, который принимает Context
в качестве аргумента. Когда вы создаете экземпляр своего пользовательского представления, вы переходите в контекст.
Почему? Поскольку представление должно иметь доступ к темам, ресурсам и другим деталям конфигурации представления.
Просмотр конфигурации на самом деле отличный пример. Каждый Контекст имеет различные параметры (поля в реализациях Context
), которые устанавливаются самой ОС для таких вещей, как размер или плотность отображения. Легко понять, почему эта информация важна для настройки представлений и т.д.
Последнее слово: По какой-то причине люди, плохо знакомые с Android (и даже не новички), похоже, полностью забывают об объектно-ориентированном программировании, когда дело доходит до Android. По какой-то причине люди пытаются склонить свои разработки под Android к заранее продуманным парадигмам или изученному поведению.
У Android есть своя собственная парадигма и определенная схема, которая на самом деле вполне последовательна, если вы отпустите ваши предвзятые представления и просто прочитаете документацию и руководство разработчика. Моя реальная точка зрения, однако, в то время как "получение правильного контекста" может иногда быть хитрым, люди неоправданно паникуют, потому что сталкиваются с ситуацией, когда им нужен контекст и думают, что его нет. Еще раз, Java является объектно-ориентированным языком с дизайном наследования.
Вы только "имеете" контекст внутри своей Деятельности, потому что ваша деятельность сама наследуется от Контекста. В этом нет никакой магии (за исключением всего того, что сама ОС делает для установки различных параметров и для правильной "настройки" вашего контекста). Таким образом, оставляя в стороне проблемы с памятью/производительностью (например, удерживая ссылки на контекст, когда вам это не нужно, или делая это таким образом, что это имеет негативные последствия для памяти и т.д.), Context - это объект, подобный любому другому, и его можно передавать так же, как любой POJO (обычный старый объект Java). Иногда вам может потребоваться сделать что-то умное для извлечения этого контекста, но любой обычный класс Java, который расширяется из ничего, кроме самого объекта, может быть написан так, чтобы иметь доступ к контексту; просто предоставьте открытый метод, который принимает контекст, а затем используйте его в этом классе по мере необходимости. Это не было задумано как исчерпывающий подход к Context или внутренним компонентам Android, но я надеюсь, что это немного поможет в демистификации Context.
Контекст - это дескриптор системы; он предоставляет такие услуги, как разрешение ресурсов, получение доступа к базам данных и настройкам и т.д. В приложении для Android есть действия. Контекст подобен дескриптору среды, в которой ваше приложение в данный момент выполняется. Объект действия наследует объект контекста.
Для получения дополнительной информации см. Введение в разработку Android с Android Studio - учебное пособие.
Context
- это "интерфейс" к глобальной информации о среде приложения. На практике Context
на самом деле является абстрактным классом, реализация которого обеспечивается системой Android.
Он позволяет получить доступ к ресурсам и классам, относящимся к конкретному приложению, а также к дополнительным вызовам для операций на уровне приложения, таких как запуск, широковещание и получение и т.д.
На следующем рисунке вы видите иерархию классов, где Context
является корневым классом этой иерархии. В частности, стоит подчеркнуть, что Activity
является потомком Context
.
Что именно Context
?
Согласно справочной документации по Android, это объект, который представляет различные данные среды. Он обеспечивает доступ к локальным файлам, базам данных, загрузчикам классов, связанным со средой, службам (включая службы системного уровня) и многим другим. В этой книге и в повседневной работе с Android вы будете часто видеть контекст.
Из книги "Android на практике", стр. 60.
Некоторым API Android требуется параметр Context
Если вы посмотрите через различные API-интерфейсы Android, вы будете
обратите внимание, что многие из них принимают объект android.content.Context
как
параметр. Вы также увидите, что Деятельность или Сервис обычно используются как
Context
. Это работает, потому что оба этих класса происходят из Context
.
Простой пример, чтобы понять context
в Android:
У каждого босса есть помощник, за которым нужно ухаживать, выполнять все менее важные и трудоемкие задачи. Если файл или чашка кофе необходимы, помощник в бегах. Некоторые начальники почти не знают, что происходит в офисе, поэтому они спрашивают своих помощников об этом тоже. Они выполняют некоторую работу сами, но в большинстве других случаев им нужна помощь их помощников.
В этом сценарии
Босс - это приложение для Android
Помощник - это контекст
Файлы/Чашка кофе - это ресурсы
Обычно мы называем контекст, когда нам нужно получить информацию о различных частях нашего приложения, таких как "Действия", "Приложения" и т.д.
Некоторые операции (вещи, где нужен помощник), где задействован контекст:
Различные способы получения контекста:
getContext()
getBaseContext()
getApplicationContext()
this
An Android Контекст Android - это Интерфейс (в общем смысле, не в смысле Java; в Java Context
на самом деле является абстрактным классом!), Который обеспечивает доступ к ресурсам, специфичным для приложения. и класс и информация о среде приложения.
Если бы ваше приложение для Android было веб-приложением, ваш контекст был бы похож на ServletContext
(здесь я не буду проводить точное сравнение).
Ваши действия и службы также расширяют Context
, поэтому они наследуют все эти методы для доступа к информации о среде, в которой работает приложение.
Context
представляет собой дескриптор для получения данных среды.Context
класс объявлен как абстрактный, реализация которого обеспечивается ОС Android.Context
подобен удаленному каналу телевидения, а на телевидении находятся ресурсы, услуги и т.д. Что ты можешь сделать с этим?
Способы получения контекста:
Просто поместите его там для новичков;
Итак, сначала поймите контекст Word:
В англо-lib. это означает:
"Условия, которые формируют настройку для события, оператора или идеей и с точки зрения которой она может быть полностью понята и оценена".
"Части того, что написано или сказано, что непосредственно предшествует и следуйте слову или пропуску и уточните его значение".
Теперь возьмите то же самое понимание в мире программирования:
контекст текущего состояния приложения/объекта. Это позволяет вновь созданным объектам понять, что происходит. Обычно вы вызываете его, чтобы получить информацию о другой части вашей программы (активность, пакет/приложение)
Вы можете получить контекст, вызвав getApplicationContext()
, getContext(), getBaseContext()
или this
(если в классе активности).
Чтобы получить контекст Anywhere в приложении, используйте следующий код:
Создайте новый класс AppContext
внутри вашего приложения для Android.
public class AppContext extends Application {
private static Context context;
public void onCreate(){
super.onCreate();
AppContext.context = getApplicationContext();
}
public static Context getAppContext() {
return AppContext.context;
}
}
Теперь, когда вы хотите использовать контекст приложения в классе, отличном от него, вызовите этот метод, и у вас есть контекст приложения.
Надеюсь на эту помощь;)
Контекст - это ссылка на текущий объект. Также контекст позволяет получить доступ к информации о среде приложения.
Подумайте об этом как о виртуальной машине, которая затмила процесс, в котором запущено приложение или служба. Сильная среда имеет доступ к кучу базовой информации о системе и некоторым разрешенным ресурсам. Этот контекст нужен для получения этих услуг.
Класс android.content.Context
обеспечивает подключение к системе Android и ресурсам проекта. Это интерфейс для глобальной информации о среде приложения.
Контекст также обеспечивает доступ к службам Android, например. Служба определения местоположения.
Действия и службы расширяют класс Context
.
Контекст - это экземпляры класса android.content.Context обеспечивает подключение к системе Android, которая выполняет приложение. Например, вы можете проверить размер текущего дисплея устройства через контекст.
Он также предоставляет доступ к ресурсам проекта. Это интерфейс для глобальной информации о среде приложения.
Класс Context также предоставляет доступ к службам Android, например диспетчеру аварийных сигналов, для запуска событий, основанных на времени.
Действия и службы расширяют класс Context. Поэтому они могут напрямую использоваться для доступа к Контексту.
Контекст - это интерфейс для глобальной информации о среде приложения. Это абстрактный класс, реализация которого обеспечивается системой Android
.
Context
разрешает доступ к ресурсам и классам приложений, а также вызывает операции на уровне приложения, такие как launching activities, broadcasting and receiving intents, etc.
Вот пример
public class MyActivity extends Activity {
public void Testing() {
Context actContext = this; /*returns the Activity Context since Activity extends Context.*/
Context appContext = getApplicationContext(); /*returns the context of the single, global Application object of the current process. */
Button BtnShowAct1 = (Button) findViewById(R.id.btnGoToAct1);
Context BtnContext = BtnShowAct1.getContext(); /*returns the context of the View. */
Более подробную информацию вы можете найти http://developer.android.com/reference/android/content/Context.html
Контекст - это в основном доступ к ресурсам и получение информации о среде для приложения (для контекста приложения) или активности (для контекста активности) или любого другого...
Чтобы избежать утечки памяти, вы должны использовать контекст приложения для всех компонентов, для которых нужен объект контекста.... для более быстрого нажатия здесь
Это одна хорошая и недавняя статья о Context в Android. http://www.doubleencore.com/2013/06/context/
Контекст - это контекст текущего состояния приложения/объекта. Он представляет собой объект, представляющий различные данные среды. Контекст помогает текущей активности взаимодействовать с внешней средой андроида, например, локальными файлами, базами данных, загрузчиками классов, связанными с окружающей средой, услугами, включая сервисы на системном уровне и т.д.
A Контекст - это дескриптор системы. Он предоставляет такие услуги, как разрешение ресурсов, получение доступа к базам данных и предпочтениям и т.д. У приложения Android есть действия. Это как дескриптор среды, в которой выполняется ваше приложение. Объект activity наследует объект Context.
Различные методы вызова, с помощью которых вы можете получить контекст 1. getApplicationContext(), 2. getContext(), 3. getBaseContext() 4. или это (когда в классе активности).
Контекст означает, что Android узнает, в какую деятельность мне следует пойти или в какую деятельность.
1 - Toast.makeText(context, "Enter All Details", Toast.LENGTH_SHORT).show();
это используется в этом. Context context = ActivityName.this;
2 - startActivity(new Intent(context,LoginActivity.class));
в этом контексте означает, из какой деятельности вы хотите перейти к другой деятельности. context или ActivityName.this быстрее, getContext и getApplicatinContext.
A Context
- это то, что большинство из нас назвало бы Application. Он создан системой Android и способен делать только то, что может сделать приложение.
В Tomcat контекст также является тем, что я бы назвал приложением.
Существует один Контекст, который содержит много Деяний, каждое действие может иметь много видов.
Очевидно, что некоторые скажут, что он не подходит из-за того или иного, и они, вероятно, правы, но говорят, что контекст - это ваше текущее приложение, которое поможет вам понять, что вы вставляете в параметры метода.
одна из хороших ссылок о Context
Давайте проведем небольшую аналогию, прежде чем углубиться в техническую специфику контекста
У каждого босса есть помощник или кто-то (мальчик на побегушках), который делает для него менее важные и более трудоемкие вещи. Например, если им нужен файл или кофе, помощник будет в бегах. Босс не будет знать, что происходит в фоновом режиме, но файл или задание будет доставлено
Так вот
Босс - приложение для Android
Помощник - Контекст
Файл или чашка кофе - Ресурс
Контекст - это ваша точка доступа к ресурсам, связанным с приложением
Давайте посмотрим некоторые из таких ресурсов или задач
Запуск деятельности.
Получение абсолютного пути к каталогу кэша приложения в файловой системе.
Определение того, разрешено ли данное разрешение для определенного процесса и идентификатора пользователя, работающего в системе.
Проверка, было ли вам предоставлено конкретное разрешение.
И так далее.
Поэтому, если приложение Android хочет запустить действие, оно переходит прямо к Context
(точка доступа), и класс Context
возвращает ему ресурсы (в данном случае Intent).
Как и любой другой класс, у класса Context
тоже есть поля и методы.
Вы можете узнать больше о Context
в официальной документации, он охватывает почти все, доступные методы, поля и даже как использовать поля с методами.
Интерфейс к глобальной информации о среде приложения. Это абстрактный класс, реализация которого обеспечивается системой Android. Он позволяет получить доступ к ресурсам и классам приложений, а также переадресации для операций на уровне приложений, таких как запуск, трансляция и получение намерений и т.д.
Экземпляры класса android.content.Context обеспечивают подключение к системе Android, которая выполняет приложение. Например, вы можете проверить размер текущего дисплея устройства через контекст.
Он также предоставляет доступ к ресурсам проекта. Это интерфейс для глобальной информации о среде приложения.
Класс Context также предоставляет доступ к службам Android, например диспетчеру аварийных сигналов, для запуска событий, основанных на времени.
Действия и службы расширяют класс Context. Поэтому они могут быть напрямую использованы для доступа к Контексту.
Контекст - это андроид, специфичный для каждого приложения Sandbox который предоставляет доступ к приватным данным приложения доступа к ресурсам, базе данных, приватным файлам, настройкам, настройкам...
Большинство приватных одинаковых для всех видов деятельности/служб/широковещательных приложений одного приложения.
Так как Application, Activity, Service реализуют интерфейс Context, они могут использоваться там, где для вызова api требуется параметр Context
Простое, андроиды Context
- это беспорядок, который вам не понравится, пока вы не перестанете беспокоиться.
Android Context
:
Бог-объекты.
Вещь, которую вы хотите передать всем своим приложением, когда начинаете разрабатывать Android, но избегайте этого, когда вы немного приблизитесь к программированию, тестированию и самому Android.
Неявная зависимость.
Общий источник утечек памяти.
PITA для тестирования.
Фактический контекст, используемый системой Android для отправки разрешений, ресурсов, предпочтений, служб, трансляций, стилей, отображения диалогов и раздувания макета. И вам нужны разные экземпляры Context
для некоторых отдельных вещей (очевидно, вы не можете показать диалог из приложения или контекста службы, макеты, раздутые из контекста приложения и активности, могут отличаться).
Если вы хотите связать Контекст с другими знакомыми классами в Android, имейте в виду эту структуру:
Контекст < ContextWrapper < Применение
Контекст < ContextWrapper < ContextThemeWrapper < Активность
Контекст < ContextWrapper < ContextThemeWrapper < Активность < ListActivity
Контекст < ContextWrapper < Сервис
Контекст < ContextWrapper < Обслуживание < IntentService
Итак, все эти классы являются контекстами по-своему. Если вы хотите, вы можете использовать Сервис и ListActivity для контекста. Но если вы посмотрите внимательно, некоторые из классов наследуют тему. В действии или фрагменте вы хотели бы, чтобы их применяли к вашим представлениям, но не заботитесь об этом, например, в классе Service.
Я объясняю разницу в контекстах здесь.
Context
означает компонент (или приложение) в разные периоды времени. Если я ем столько пищи между 1 и 2 часами, то мой контекст того времени используется для доступа ко всем методам (или ресурсам), которые я использую в течение этого времени. Контент - это компонент (приложение) для определенного времени. Context
компонентов приложения постоянно изменяется в зависимости от базового жизненного цикла компонентов или приложения. Например, внутри функции onCreate() Activity
,
getBaseContext()
- предоставляет context
Activity
который установлен (создан) конструктором активности. getApplicationContext()
- дает настройку Context
(созданную) во время создания приложения.
Примечание. <application>
содержит все компоненты Android.
<application>
<activity> .. </activity>
<service> .. </service>
<receiver> .. </receiver>
<provider> .. </provider>
</application>
Это означает, что когда вы вызываете getApplicationContext()
из любого компонента, вы вызываете общий контекст всего приложения.
Context
продолжает изменяться системой на основе жизненного цикла компонентов.
Контекст - это контекст текущего состояния приложения/объекта. Он представляет собой объект, представляющий различные данные среды. Контекст помогает текущей активности взаимодействовать с внешней средой андроида, например, локальными файлами, базами данных, загрузчиками классов, связанными с окружающей средой, услугами, включая сервисы на системном уровне и т.д.
A Контекст - это дескриптор системы. Он предоставляет такие услуги, как разрешение ресурсов, получение доступа к базам данных и предпочтениям и т.д. У приложения Android есть действия. Это как дескриптор среды, в которой выполняется ваше приложение. Объект activity наследует объект Context. Примеры использования контекста:
Создание новых объектов: создание новых представлений, адаптеров, прослушивателей
TextView tv = new TextView(getContext());
ListAdapter adapter = new SimpleCursorAdapter(getApplicationContext(), ...);
Доступ к стандартным общим ресурсам: Сервисы, такие как LAYOUT_INFLATER_SERVICE, SharedPreferences:
context.getSystemService(LAYOUT_INFLATER_SERVICE)
getApplicationContext().getSharedPreferences(*name*, *mode*);
Доступ к компонентам неявно: относительно поставщиков контента, трансляций, намерений
getApplicationContext().getContentResolver().query(uri, ...);
Разница между контекстом работы и контекстом приложения:
Они оба являются экземплярами Context, но экземпляр приложения привязан к жизненному циклу приложения, а экземпляр Activity привязан к жизненному циклу Activity. Таким образом, они имеют доступ к различной информации о среде приложения.
Если вы читаете документы в getApplicationContext, он отмечает, что вы должны использовать это, только если вам нужен контекст, жизненный цикл которого отделен от текущего контекста.
Но, в общем, используйте контекст активности, если у вас нет веских оснований.
Необходимость контекста:
В документации говорится, что для каждого представления нужен контекст для доступа к нужным ресурсам (например, тема, строки и т.д.).
Но почему в конструкторе, а не через setContentView (View)?
1.Потому что ресурсы должны быть доступны во время создания представления (для полного инициализации представления конструктору потребуются некоторые ресурсы).
2. Это позволяет гибко использовать контекст, который отличается от одного из текущей активности (представьте себе представление, которое использует некоторые другие строковые ресурсы, а не те из текущей активности).
3. Дизайнеры Android SDK, похоже, выбрали, что контекст должен быть установлен только один раз, а затем оставаться неизменным на протяжении всего жизненного цикла представления. Почему контекст не определяется автоматически в точке строительства?
1. Если нет статической переменной, которая сообщит вам текущий глобальный контекст вашего приложения. Метод getApplicationContext() является самым близким к нему, но не является статичным, поэтому вам нужен экземпляр объекта Activity для его вызова.
2. Язык Java предоставляет возможность просматривать стек вызовов и определять, был ли View создан в классе Context. Но что, если их много? Или что, если их нет? Этот метод очень дорог и подвержен ошибкам. Поэтому разработчики API решили, что контекст должен быть предоставлен вручную.
Context
означает текущий. Использование Context
для работы на текущем экране. ех.
1. getApplicationContext()
2. getContext()
Toast.makeText(getApplicationContext(), "hello", Toast.LENGTH_SHORT).show();