Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

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

#android #context


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

 Toast.makeText(context, String, int);


Первый параметр статического метода makeText класса Toast - это контекст. Но я могу
передать this (если вызов метода находится не дальше одного блока кода) или MainActivity.this
(если имя класса-активности MainActivity), могу также передать getApplicationContext(). 


Так в чем разница? 
Почему в качестве контекста можно передать this? Это же ссылка на класс
Есть ли случаи когда надо передать именно getApplicationContext?
Почему контекст нужен везде, где происходит работа с интерфейсом?
Почему любой виджет имеет конструктор, в который надо передать контекст?
Что вообще такое контекст? 


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


Ответы

Ответ 1



класс Context содержит в себе всевозможную информацию о ресурсах системы, как уже было сказано в другом ответе. Конкретно в этом вопросе нас интересует, что он содержит, помимо прочего, и параметры темы (стилей) для отображения View Почему в качестве контекста можно передать this? Это же ссылка на класс Активити является наследником класса Context и несет в себе информацию о контексте для этой активити, поэтому мы можем использовать ссылку на именно этот класс в качестве контекста. С Fragment, к примеру, это уже не работает - он не наследуется от Context Есть ли случаи когда надо передать именно getApplicationContext? Тема (стиль) всего приложения и конкретной активити может отличаться (для активити в манифесте указан другой стиль). Тогда запрос контекста приложения и контекста активти вернет разное оформление View Почему контекст нужен везде, где происходит работа с интерфейсом? Потому что он содержит стиль для View на остальные вопросы ответ тот же - в контексте содержится информация, как должен выглядеть View. Например, стиль кнопки темы Holo и темы AppCompat сильно отличается, в контексте и содержится эта информация. Возможно в приложении могут существовать и какие то другие отличия в окружении, назначенном всему приложению и конкретной активити, тогда обращение к контексту приложения или активити тоже будет иметь значение, но мне такие отличия (кроме тем и стилей) припомнить не удалось. UPD несколько важных замечаний по getApplicationContext(), не связанных с UI приложения из этой статьи контекст приложения следует использовать везде, где контекст необходимо передать за пределы жизненного цикла передающего компонента (в объекты, которые будут жить дольше, чем создавшая/вызвавшая их активность, например) во избежании удержания ссылки на этот компонент при использовании его собственного контекста и утечек памяти. во внешние библиотеки следует передавать контекст приложения по тем же причинам, что и п.1 контекст приложения не имеет информации по особенностям GUI отдельной активити, если они отличаются от параметров всего приложения, в таких случаях нельзя использовать контекст приложения при работе с GUI этой активити. приложение (класс Application) - синглтон и его контекст тоже синглтон, этот контекст может удерживать объекты с более коротким жизненным циклом и приводить к утечкам памяти, если не позаботиться о их корректной обработке GC

Ответ 2



В исходниках класса копаться не пробовали? Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc. источник (2 ссылка запроса "context android" в Google) Если всё ещё не понятно: Context – это объект, который предоставляет доступ к базовым функциям приложения: доступ к ресурсам, к файловой системе, вызов активности и т.д. Activity является подклассом Context, поэтому в коде мы можем использовать её как ИмяАктивности.this (напр. MainActivity.this), или укороченную запись this. Классы Service, Application и др. также работают с контекстом. источник (1 ссылка запроса "context android" в Google!!!) Идеальный ответ на все Ваши вопросы.

Комментариев нет:

Отправить комментарий