Getapplicationcontext android для чего

Context

Context – это объект, который предоставляет доступ к базовым функциям приложения: доступ к ресурсам, к файловой системе, вызов активности и т.д. Activity является подклассом Context, поэтому в коде мы можем использовать её как ИмяАктивности.this (напр. MainActivity.this), или укороченную запись this. Классы Service, Application и др. также работают с контекстом.

Доступ к контексту можно получить разными способами. Существуют такие методы как getApplicationContext(), getContext(), getBaseContext() или this, который упоминался выше, если используется в активности.

На первых порах не обязательно понимать, зачем он нужен. Достаточно помнить о методах, которые позволяют получить контекст и использовать их в случае необходимости, когда какой-нибудь метод или конструктор будет требовать объект Context в своих параметрах.

В свою очередь Context имеет свои методы, позволяющие получать доступ к ресурсам и другим объектам.

  • getAssets()
  • getResources()
  • getPackageManager()
  • getString()
  • getSharedPrefsFile()

Возьмём к примеру метод getAssets(). Ваше приложение может иметь ресурсы в папке assets вашего проекта. Чтобы получить доступ к данным ресурсам, приложение использует механизм контекста, который и отвечает доступность ресурсов для тех, кто запрашивает доступ — активность, служба и т.д. Аналогично происходит с методом getResources. Например, чтобы получить доступ к ресурсу цвета используется конструкция getResources().getColor(), которая может получить доступ к данным из файла res/colors.xml.

Таким образом, создавая, например, вторую активность, мы можем сразу обеспечить ей доступ к своим ресурсам, так как активность относится к контексту. При создании собственных компонентов View также используется контекст в конструкторах, так как компонент тоже может использовать ваши ресурсы. При создании собственных классов, если вам нужно будет обращаться к контексту, то необходимо создать конструктор:

Через контекст можно узнать практически всю информацию о вашем приложении — имя пакета, класса и т.п.

Тем не менее, следует различать контекст в разных ситуациях. Допустим, у вас есть приложение с несколькими активностями. В манифесте можно прописать используемую тему как для всего приложения, так и для каждой активности в отдельности. Соответственно, выбор контекста повлияет на результат. Как правило, при использовании собственной темы предпочтительнее использовать контекст активности, а не приложения.

Очень часто начинающие программисты впадают в ступор, когда ключевое слово this не работает в анонимных классах, например, при щелчке кнопки. В этом случае, используйте полное имя класса перед ним.

При создании адаптеров для списков также обращаются к контексту.

Или ещё пример для адаптера в фрагменте ListFragment:

Здесь тоже следует быть внимательным, если используется своя тема для списка.

Последнее замечание относится к опытным программистам. Неправильный контекст может послужить источником утечки памяти. Если вы создадите собственный класс, в котором содержится статическая переменная, обращающая к контексту активности, то система будет держать ссылку на переменную. Если активность будет закрыта, то сборщик мусора не сможет очистить память от переменной и самой неиспользуемой активности. В таких случаях лучше использовать контекст приложения через метод getApplicationContext().

ContextCompat

В библиотеки совместимости появился свой класс для контекста ContextCompat. Он может вам пригодиться, когда студия вдруг подчеркнёт метод в старом проекте и объявит его устаревшим.

Допустим, мы хотим поменять цвет текста на кнопки.

Студия ругается, что нужно использовать новый вариант getColor(int, Theme). Заменим строчку.

Если посмотреть на исходники этого варианта, то увидим, что там тоже идёт вызов нового метода. Поэтому можно сразу использовать правильный вариант, если вы пишете под Marshmallow и выше.

Источник

Context — контекст в android — что это, как получить и зачем использовать

Контекст (Context) – это базовый абстрактный класс, реализация которого обеспечивается системой Android. Этот класс имеет методы для доступа к специфичным для конкретного приложения ресурсам и классам и служит для выполнения операций на уровне приложения, таких, как запуск активностей, отправка широковещательных сообщений, получение намерений и прочее. От класса Context наследуются такие крупные и важные классы, как Application, Activity и Service, поэтому все его методы доступны из этих классов.


Получить контекст внутри кода можно одним из следующих методов:

  • getBaseContext(получить ссылку на базовый контекст)
  • getApplicationContext(получить ссылку на объект приложения)
  • getContext (внутри активности или сервиса получить ссылку на этот объект)
  • this(то же, что и getContext)
  • MainActivity.this (внутри вложенного класса или метода получить ссылку на объект MainActivity)
  • getActivity(внутри фрагмента получить ссылку на объект родительской активности)
Читайте также:  Создай своего андроида детройт

Контекст (Context) – это базовый абстрактный класс, реализация которого обеспечивается системой Android. Этот класс имеет методы для доступа к специфичным для конкретного приложения ресурсам и классам и служит для выполнения операций на уровне приложения, таких, как запуск активностей, отправка широковещательных сообщений, получение намерений и прочее. От класса Context наследуются такие крупные и важные классы, как Application, Activity и Service, поэтому все его методы доступны из этих классов. Источник


Получить контекст внутри кода можно одним из следующих методов:

Источник

Context в Android приложении

Что такое Context?

Как следует из названия, это контекст текущего состояния приложения или объекта. Это позволяет вновь созданным объектам понять, что вообще происходит. Обычно его вызывают, чтобы получить информацию о другой части программы.

Кроме того, Context является проводником в систему, он может предоставлять ресурсы, получать доступ к базам данных, преференсам и т.д. Ещё в Android приложениях есть Activity . Это похоже на проводник в среду, в которой выполняется ваше приложение. Объект Activity наследует объект Context . Он позволяет получить доступ к конкретным ресурсам и информации о среде приложения.

Context присутствует практически повсюду в Android приложении и является самой важной его частью, поэтому необходимо понимать, как правильно его использовать.

Неправильное использование Context может легко привести к утечкам памяти в Android приложении.

Существует много разных типов контекста, поэтому давайте разберёмся, что каждый из них представляет из себя, как и когда их правильно использовать.

Контекст приложения

Это singleton-экземпляр (единственный на всё приложение), и к нему можно получить доступ через функцию getApplicationContext() . Этот контекст привязан к жизненному циклу приложения. Контекст приложения может использоваться там, где вам нужен контекст, жизненный цикл которого не связан с текущим контекстом или когда вам нужно передать контекст за пределы Activity .

Например, если вам нужно создать singleton-объект для вашего приложения, и этому объекту нужен какой-нибудь контекст, всегда используйте контекст приложения.

Если вы передадите контекст Activity в этом случае, это приведет к утечке памяти, так как singleton-объект сохранит ссылку на Activity и она не будет уничтожена сборщиком мусора, когда это потребуется.

В случае, когда вам нужно инициализировать какую-либо библиотеку в Activity , всегда передавайте контекст приложения, а не контекст Activity .

Таким образом, getApplicationContext() нужно использовать тогда, когда известно, что вам нужен контекст для чего-то, что может жить дольше, чем любой другой контекст, который есть в вашем распоряжении.

Контекст Activity

Этот контекст доступен в Activity и привязан к её жизненному циклу. Контекст Activity следует использовать, когда вы передаете контекст в рамках Activity или вам нужен контекст, жизненный цикл которого привязан к текущему контексту.

getContext() в ContentProvider

Этот контекст является контекстом приложения и может использоваться аналогично контексту приложения. К нему можно получить доступ через метод getContext() .

Когда нельзя использовать getApplicationContext()?

Правило большого пальца

В большинстве случаев используйте контекст, доступный непосредственно из компонента, в котором вы работаете в данный момент. Вы можете безопасно хранить ссылку на него, если она не выходит за пределы жизненного цикла этого компонента. Как только вам нужно сохранить ссылку на контекст в объекте, который живет за пределами вашей Activity или другого компонента, даже временно, используйте ссылку на контекст приложения.

Источник

Context в Android приложении

Что такое Context?

Как следует из названия, это контекст текущего состояния приложения или объекта. Это позволяет вновь созданным объектам понять, что вообще происходит. Обычно его вызывают, чтобы получить информацию о другой части программы.

Кроме того, Context является проводником в систему, он может предоставлять ресурсы, получать доступ к базам данных, преференсам и т.д. Ещё в Android приложениях есть Activity . Это похоже на проводник в среду, в которой выполняется ваше приложение. Объект Activity наследует объект Context . Он позволяет получить доступ к конкретным ресурсам и информации о среде приложения.

Context присутствует практически повсюду в Android приложении и является самой важной его частью, поэтому необходимо понимать, как правильно его использовать.

Неправильное использование Context может легко привести к утечкам памяти в Android приложении.

Существует много разных типов контекста, поэтому давайте разберёмся, что каждый из них представляет из себя, как и когда их правильно использовать.

Контекст приложения

Это singleton-экземпляр (единственный на всё приложение), и к нему можно получить доступ через функцию getApplicationContext() . Этот контекст привязан к жизненному циклу приложения. Контекст приложения может использоваться там, где вам нужен контекст, жизненный цикл которого не связан с текущим контекстом или когда вам нужно передать контекст за пределы Activity .

Например, если вам нужно создать singleton-объект для вашего приложения, и этому объекту нужен какой-нибудь контекст, всегда используйте контекст приложения.

Читайте также:  Беспроводная клавиатура с мышкой для андроид

Если вы передадите контекст Activity в этом случае, это приведет к утечке памяти, так как singleton-объект сохранит ссылку на Activity и она не будет уничтожена сборщиком мусора, когда это потребуется.

В случае, когда вам нужно инициализировать какую-либо библиотеку в Activity , всегда передавайте контекст приложения, а не контекст Activity .

Таким образом, getApplicationContext() нужно использовать тогда, когда известно, что вам нужен контекст для чего-то, что может жить дольше, чем любой другой контекст, который есть в вашем распоряжении.

Контекст Activity

Этот контекст доступен в Activity и привязан к её жизненному циклу. Контекст Activity следует использовать, когда вы передаете контекст в рамках Activity или вам нужен контекст, жизненный цикл которого привязан к текущему контексту.

getContext() в ContentProvider

Этот контекст является контекстом приложения и может использоваться аналогично контексту приложения. К нему можно получить доступ через метод getContext() .

Когда нельзя использовать getApplicationContext()?

  • Это не полноценный контекст, поддерживающий всё, что может Activity . Некоторые вещи, которые вы попытаетесь сделать с этим контекстом, потерпят неудачу, в основном связанные с графическим интерфейсом.
  • Могут появляться утечки памяти, если контекст из getApplicationContext() удерживается на каком-то объекте, который вы не очищаете впоследствии. Если же где-то удерживается контекст Activity , то как только Activity уничтожается сборщиком мусора, всё остальное тоже уничтожается. Объект Application остается на всю жизнь вашего процесса.

Правило большого пальца

В большинстве случаев используйте контекст, доступный непосредственно из компонента, в котором вы работаете в данный момент. Вы можете безопасно хранить ссылку на него, если она не выходит за пределы жизненного цикла этого компонента. Как только вам нужно сохранить ссылку на контекст в объекте, который живет за пределами вашей Activity или другого компонента, даже временно, используйте ссылку на контекст приложения.

Источник

Русские Блоги

Статья позволяет досконально понять, что такое Context, как заниматься разработкой под Android, если вы не понимаете?

Предисловие

Сегодня мы проанализируем исходный код Context. При разработке приложений мы часто будем использовать Context. Так что же такое Context? Его обычная семантика — это «контекст», так что же это за «контекст»? Путем анализа исходного кода мы можем получить базовое понимание этого контекста.

Диаграмма наследования классов

Давайте посмотрим на диаграмму наследования классов Context. Из исходного кода мы знаем, что Context является абстрактным классом, поэтому у него должен быть класс реализации. Убедитесь, что его классы реализации — это ContextWrapper и ContextImpl, поэтому его диаграмма наследования выглядит следующим образом :

Вышеупомянутая связь наследования класса контекста ясна и лаконична.Можно знать, что приложение, служба и действие являются унаследованными классами контекста, поэтому отсюда мы можем знать:

Кроме того, мы видим, что и приложение, и служба напрямую наследуют ContextWrapper, а Activity наследует ContextThemeWrapper. Почему? Фактически ContextThemeWrapper посвящен классам тем, Activity имеет интерфейс, а Application и Service — нет. Далее давайте подробно рассмотрим их реализацию в исходном коде.

ContextWrapper

Когда мы вводим исходный код ContextWrapper, мы можем обнаружить, что он фактически вызывает метод в mBase, а mBase на самом деле является ContextImpl, поэтому в конце нам все равно придется вызвать метод в его классе реализации ContextImpl.

Мы можем анализировать по порядку в соответствии с диаграммой наследования вышеуказанного класса.Из вышеизложенного мы можем узнать, что ContextWrapper на самом деле вызывает методы в ContextImpl, поэтому Application, Service и Activity должны быть связаны с ContextImpl. Это правда? Отслеживаем исходный код для анализа.

Application

Подобно программе основного метода запуска Java, Android также имеет аналогичный метод, то есть в классе ActivityThread есть main. Это место для начала. Давайте проследим немного отсюда:

Мы находим основной метод ActivityThread, опуская нерелевантный код.Этот основной метод состоит в том, чтобы постоянно получать сообщения из очереди сообщений и затем обрабатывать их. На этот раз мы не будем анализировать вещи, связанные с Looper, только проанализируем контент, связанный с Context, и продолжим вводить метод присоединения.

Android анализирует исходный код, мы не можем в него углубляться, мы должны в основном анализировать его процесс.

Здесь отображается ContextImpl, поэтому следующее должно быть связано с Application, поэтому введите метод makeApplication, чтобы продолжить отслеживание,

Наконец, введите метод Instrumentation # newApplication

Все ясно и ясно, когда вы сюда попали, вы в конечном итоге вызовете метод attachBaseContext для ContextWrapper. От вышесказанного до этого, как и ожидалось, анализ здесь, сколько вы запомнили? Вы знаете только, что метод attachBaseContext в конечном итоге будет вызван в Application? Совершенно верно. Нельзя нырять в океан кода и бродить по нему. Вы заблудитесь. Исходный код Android такой большой и его так много. Невозможно проанализировать детали. Так что вы можете только понять процесс, а затем Затем проанализируйте процесс внедрения соответствующим образом. Затем проанализируйте соответствующие методы в Сервисе.

Читайте также:  Джойстик ps3 для android смартфона

Service

Для Service мы можем найти метод handleCreateService в ActivityThread, который связан с соединением между Service и ContextImpl.

Что касается кода приложения, мы можем обнаружить, что они очень похожи. Мы вводим метод attach, чтобы просмотреть соответствующий код и найти

Код очень простой, вот как он связан с ContextImpl. Поскольку Service и Application являются унаследованными классами ContextWrapper, давайте проанализируем код Activity.

Activity

Объясните здесь, почему Service и Application являются унаследованными классами ContextWrapper, в то время как Activity наследует ContextThemeWrapper. Это потому, что Activity имеет отображение интерфейса, а Service и Application — нет. Итак, из названия мы можем видеть, что ContextThemeWrapper содержит информацию о теме. В то же время ContextThemeWrapper унаследован от ContextWrapper.Проанализировав исходный код ContextThemeWrapper, мы видим, что в основном существуют методы, связанные с темой, а также метод attachBaseContext.

Мы ввели исходный код Activity и обнаружили, что он также имеет метод присоединения, аналогичный Service

Далее давайте проанализируем, какое отношение к этому имеет Activity.

Метод performLaunchActivity на самом деле является методом запуска Activity. Давайте узнаем об этом методе позже, а теперь проанализируем содержимое Context. Входим в этот метод для просмотра:

Сначала создайте ContextImpl с помощью метода createBaseContextForActivity, а затем напрямую присоедините к нему Activity. Пока что исходный код для Application, Service и Activity about Context в основном почти такой же. Далее мы решим некоторые актуальные вопросы.

Пример понимания

Поскольку приложение, служба и действие имеют контекст, в чем разница между ними? В то же время, в чем разница между getApplicationContext и getApplication ()? Затем мы проверяем с помощью кода.

В наших текущих проектах обычно есть настраиваемые классы Application для некоторых операций инициализации. В этом примере мы также создаем новый класс MyApplication, наследующий от Application, а затем регистрируем его в Manifest.xml. Код выглядит следующим образом:

Результат печати следующий:

Мы обнаружили, что когда мы получаем экземпляр Application, который мы объявили через getApplicationContext, но через getBaseContext мы получаем ContextImpl. Почему? Проверяем их реализацию

Фактически, мы проанализировали их исходный код выше и знаем, что эта mBase на самом деле ContextImpl. Пока getApplicationContext

Благодаря приведенному выше анализу мы знаем, что само приложение также является контекстом, поэтому мы возвращаем само себя. Итак, результатом получения getApplicationContext () является экземпляр самого MyApplication.

Иногда в нашем коде также используется getApplication, так в чем разница между этим и getApplicationContext? Давайте снова войдем, чтобы узнать.

Мы создаем MainActivity и печатаем в нем две строки кода:

Мы можем обнаружить, что два возвращенных результата совпадают, что нетрудно понять.

Фактически, getApplication возвращает Application, так что это одно и то же. Но оба возвращаются Application, почему у Android есть эти два метода? Это связано с проблемой области действия. Мы можем обнаружить, что областью действия метода, использующего getApplication, являются Activity и Service, но мы не можем использовать этот метод в других местах. В этом случае мы можем использовать getApplicationContext для получения Application. При каких обстоятельствах? Например: BroadcastReceiver. Если мы хотим получить экземпляр приложения в Receiver, мы можем получить его следующим образом:

Вышеупомянутый контент является частью контента о контексте.

Наконец, программистам нужно изучать слишком много знаний и технологий. Если они не хотят, чтобы их уничтожила окружающая среда, они должны постоянно совершенствоваться.Мы всегда приспосабливались к окружающей среде, а не к окружающей среде, чтобы адаптироваться к нам!

Вот оСебяОбучение Android, документы для интервью, видеоколлекция, Друзья, кому интересно, могут посмотреть

Быть программистом легко. Чтобы быть хорошим программистом, нужно постоянно учиться. От младшего программиста до старшего программиста, от младшего архитектора до старшего архитектора или к руководству, от технического менеджера до технического директора, на каждом этапе Нужно овладеть разными способностями. Как можно раньше определите направление своей карьеры, чтобы избавиться от сверстников по работе и совершенствованию способностей.

Интеллектуальная рекомендация

Многослойная презентацияViewController Jap

. Недавно, проект использует многоэтажные прыжки [A presentViewController: B animated: YES] [B presentViewController: C animated: YES] . Проблема в том, где: как это идет прямо к? Я не нашел ме.

Распечатать список с конца до головы

В случае, когда таблица цепи не может изменять дисплей, данные хранения стека могут рассматриваться с рекурсивным методом. Разрешить модификацию структуры ссылки.

Типы данных и переменные

тип данных Компьютерная программа может обрабатывать различные значения. Однако компьютеры могут обрабатывать гораздо больше, чем числовые значения. Они также могут обрабатывать различные данные, таки.

Python Daily Practice (4) -идиомы заполняют музыку

оглавление 1. Одно место 2. Случайное расположение 3. Добавьте баллы для оценки 4. Получение файла 5. Установите уровень сложности. 6. Срок завершения 7. Выберите заполнение пропусков. 1. Одно место Н.

Источник

Оцените статью