Что такое context android

Context

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

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

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

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

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

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

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

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

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

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

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

ContextCompat

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

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

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

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

Источник

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

Что такое context android. Смотреть фото Что такое context android. Смотреть картинку Что такое context android. Картинка про Что такое context android. Фото Что такое context android

Что такое Context?

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

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

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

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

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

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

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

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

Контекст Activity

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

getContext() в ContentProvider

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

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

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

Источник

Полный список

— разбираемся в коде урока 21
— теория по Intent и Intent Filter
— немного о Context

На прошлом уроке (№ 21) мы создали приложение, которое содержит два Activity. Напомню, что для создания Activity, необходимо:
создать класс, с суперклассом android.app.Activity
создать Activity-запись в манифесте и указать ей созданный класс в поле Name

Надеюсь прошлый урок не вызвал особых трудностей и процедура создания Activity примерно уложилась в голове. Теперь мы можем обратить внимание на код вызова Activity.

Мы использовали объект Intent. О нем можно почитать здесь, здесь и здесь. Правда инфа достаточно сложна для понимания с нуля. Я попробую своими словами объяснить.

Что такое Intent

В нашем случае Intent – это объект, в котором мы прописываем, какое Activity нам необходимо вызвать. После чего мы передаем этот Intent-объект методу startActivity, который находит соответствующее Activity и показывает его. При создании Intent мы использовали конструктор Intent (Context packageContext, Class cls) с двумя параметрами.

Первый параметр – это Context. Если помните, когда мы программно создавали View в одном из прошлых уроков, мы тоже использовали в конструкторах объект Context. Activity является подклассом Context, поэтому мы можем использовать ее – this. Вкратце, Context – это объект, который предоставляет доступ к базовым функциям приложения таким как: доступ к ресурсам, к файловой системе, вызов Activiy и т.д. Я думаю, в дальнейшем мы рассмотрим примеры, где явно увидим, зачем Context передается и как используется.

Второй параметр – имя класса. Напомню, что при создании записи Activity в манифест-файле мы указываем имя класса. И теперь если мы укажем тот же класс в Intent – то система, просмотрев манифест-файл обнаружит соответствие и покажет соответствующий Activity.

В этом можно легко убедиться. Мы удалим запись об Activity из манифест-файла и попробуем его после этого вызвать. Откройте проект из прошлого урока P0211_TwoActivity, откройте манифест-файл, вкладка Application и удалите запись об ActivityTwo с помощью кнопки Remove. Сохраните все, запустите приложение и попробуйте вызвать Activity кнопкой “Go to Activity Two”. Приложение выдаст ошибку. Если посмотреть логи, то видим следующий текст:

ERROR/AndroidRuntime(367): android.content.ActivityNotFoundException: Unable to find explicit activity class ; have you declared this activity in your AndroidManifest.xml?

Система говорит нам, что не нашла такого Activity класса и любезно подсказывает, что, возможно, он не прописан в манифест-файле. Снова пропишите Activity в манифест-файле, все сохраните и запускайте. Теперь должно работать.

Явный вызов

Вызов Activity с помощью такого Intent – это явный вызов. Т.е. с помощью класса мы явно указываем какое Activity хотели бы увидеть. Это обычно используется внутри одного приложения. Схематично это можно изобразить так:

Что такое context android. Смотреть фото Что такое context android. Смотреть картинку Что такое context android. Картинка про Что такое context android. Фото Что такое context android

Здесь мы создаем Intent, в качестве параметра передаем ему класс Class_B. Далее вызываем метод startActivity с созданным Intent в качестве параметра. Метод проверяет AndroidManifest на наличие Activity связанной с классом Class_B и если находит, то отображает. Все это в пределах одного приложения.

Неявный вызов

Что такое context android. Смотреть фото Что такое context android. Смотреть картинку Что такое context android. Картинка про Что такое context android. Фото Что такое context android

В Application_1 создается Intent, заполняются параметры action, data, category. Для удобства, получившийся набор параметров назовем Param_C. С помощью startActivity этот Intent отправляется на поиски подходящей Activity, которая сможет выполнить то, что нам нужно (т.е. то, что определено с помощью Param_C). В системе есть разные приложения, и в каждом из них несколько Activity. Для некоторых Activity определен Intent Filter (наборы Param_A, Param_B и т.д.), для некоторых нет. Метод startActivity сверяет набор параметров Intent и наборы параметров Intent Filter для каждой Activity. Если наборы совпадают (Param_C для обоих), то Activity считается подходящей.

Если в итоге нашлась только одна Activity – она и отображается. Если же нашлось несколько подходящих Activity, то пользователю выводится список, где он может сам выбрать какое приложение ему использовать.

Например, если в системе установлено несколько музыкальных плееров, и вы запускаете mp3, то система выведет вам список Activity, которые умеют играть музыку и попросит выбрать, какое из них использовать. А те Activity, которые умеют редактить текст, показывать картинки, звонить и т.п. будут проигнорированы.

Если для Activity не задан Intent Filter (Activity_24 на схеме), то Intent с параметрами ему никак не подойдет, и оно тоже будет проигнорировано.

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

На следующем уроке:

— Activity LifeCycle – поведение Activity при создании, вызове, закрытии

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Источник

Что такое контекст? Более обширный взгляд

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

Последний вопрос я задал, так как по ходу написания остальных, я понял, что ничего о нем не знаю 🙂

2 ответа 2

класс Context содержит в себе всевозможную информацию о ресурсах системы, как уже было сказано в другом ответе. Конкретно в этом вопросе нас интересует, что он содержит, помимо прочего, и параметры темы (стилей) для отображения View

Почему в качестве контекста можно передать this? Это же ссылка на класс

Есть ли случаи когда надо передать именно getApplicationContext?

Тема (стиль) всего приложения и конкретной активити может отличаться (для активити в манифесте указан другой стиль). Тогда запрос контекста приложения и контекста активти вернет разное оформление View

Почему контекст нужен везде, где происходит работа с интерфейсом?

Потому что он содержит стиль для View

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

контекст приложения следует использовать везде, где контекст необходимо передать за пределы жизненного цикла передающего компонента (в объекты, которые будут жить дольше, чем создавшая/вызвавшая их активность, например) во избежании удержания ссылки на этот компонент при использовании его собственного контекста и утечек памяти.

во внешние библиотеки следует передавать контекст приложения по тем же причинам, что и п.1

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

Источник

Что такое «контекст» на Android?

в программировании Android, что именно является Context класс и для чего он используется?

Я читал об этом на сайте разработчика, но я не могу это четко понимать.

30 ответов

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

типичное использование контекста:

создание новых объектов: Создание новых представлений, адаптеров, прослушивателей:

доступ к стандартным общим ресурсам: Услуги LAYOUT_INFLATER_SERVICE, SharedPreferences:

неявный доступ к компонентам: Что касается контент-провайдеров, трансляций, намерение!—9—>

определение контекста ::

более простые термины::

рассмотрим Person-X является генеральным директором начинающей компании программного обеспечения.

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

теперь генеральный директор нанимает нового разработчика.

это архитектор, который говорит ответственность вновь нанятых человек, основанный на навыках нового человека, что ли он будет работа над базой данных или UI и т. д.

более простые термины::

это как доступ активности android к ресурсу приложения.

это похоже на то, когда вы посетите отель, вы хотите завтрак, обед & ужин в подходящее время, верно?

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

вы попросите человека обслуживания номеров принести эти вещи для вас.

вот номер человека в контексте вы одиночная деятельность и отель, чтобы быть вашим приложением, наконец, завтрак, обед & ужин быть ресурсами.

вещи, которые включают контекст:

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

тема контекста в Android кажется запутанной для многих. Люди просто знают, что контекст необходим довольно часто, чтобы делать основные вещи в Android. Люди иногда паникуют, потому что они пытаются выполнить какую-то операцию, которая требует контекста, и они не знают, как «получить» правильный контекст. Я попытаюсь прояснить идею контекста в Android. Полное рассмотрение этого вопроса выходит за рамки этого поста, но я постараюсь дать общий обзор, чтобы у вас было представление о том, что такое контекст и как его использовать. Чтобы понять, что такое контекст, давайте посмотрим на исходный код:

что такое контекст?

Ну, сама документация дает довольно простое объяснение: класс контекста является » интерфейсом для глобальная информация о среде применения».

сам класс контекста объявляется как абстрактный класс, реализация которого обеспечивается ОС Android. В документации далее предусматривается, что контекст «. обеспечивает доступ к ресурсам и классам конкретных приложений, а также к вызовам для операций на уровне приложений, таких как запуск мероприятий, вещание и получение намерений и т. д.».

теперь вы можете очень хорошо понять, почему имя является контекстом. Потому что так оно и есть. Контекст предоставляет ссылку или крючок, если хотите, для действия, службы или любого другого компонента, тем самым связывая его с системой, обеспечивая доступ к глобальной среде приложений. Другими словами: контекст дает ответ на вопрос компонентов «где, черт возьми, я по отношению к приложению в целом и как я могу получить доступ/общаться с остальной частью приложения?»Если все это кажется немного запутанным, быстрый взгляд на методы, предоставляемые контексте класс дает некоторые дополнительные подсказки о его истинной природе.

вот случайная выборка этих методов:

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

таким образом, он использует execStartActivity С Instrumentation класс (на самом деле из внутреннего класса в Instrumentation под названием ActivityResult ).

на данный момент, мы начинаю заглядывать внутрь системы.

здесь OS фактически обрабатывает все. Итак, как именно инструментарий начинает работу? Ну, парам this на execStartActivity метод выше-это ваша деятельность, то есть контекст, и execStartActivity использует этот контекст.

обзор 30,000 таков: класс Instrumentation отслеживает список действий, которые он отслеживает, чтобы выполнить свою работу. Этот список используется для координации все действия и убедитесь, что все работает гладко в управлении потоком деятельности.

последнее слово: По какой-то причине люди, новые для Android (и даже не такие новые), похоже, полностью забывают о объектно-ориентированное программирование, когда дело доходит до Android. По какой-то причине люди пытаются склонить свою разработку Android к заранее задуманным парадигмам или изученному поведению.

Android имеет свою собственную парадигму и определенный шаблон, который на самом деле довольно последователен, если отпустить ваши заранее задуманные понятия и просто прочитать документацию и руководство dev. Моя реальная точка зрения, однако, в то время как «получение правильного контекста» иногда может быть сложным, люди неоправданно паникуют, потому что они сталкиваются с ситуация, когда они нуждаются в контексте и думают, что у них его нет. Опять же, Java-это объектно-ориентированный язык с дизайном наследования.

у вас только «есть» контекст внутри вашей деятельности, потому что ваша деятельность сама наследуется от контекста. В этом нет магии (за исключением всего того, что ОС делает сама по себе, чтобы установить различные параметры и правильно «настроить» ваш контекст). Таким образом, откладывая проблемы с памятью/производительностью (например, удерживая ссылки на контекст, когда вам не нужно или делать это таким образом, который имеет негативные последствия для памяти и т. д.), контекст-это объект, как и любой другой, и его можно передавать так же, как любой POJO (простой старый объект Java). Иногда вам может потребоваться сделать умные вещи, чтобы получить этот контекст, но любой обычный класс Java, который простирается ни от чего другого, кроме самого объекта, может быть написан таким образом, что имеет доступ к контексту; просто выставьте открытый метод, который принимает контекст, а затем используйте его в этом классе по мере необходимости. Это было не предназначен для исчерпывающего лечения контекста или внутренних Android, но я надеюсь, что это поможет в демистификации контекста немного.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *