Страницы

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

четверг, 28 марта 2019 г.

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

Сколько уже разрабатываю приложения, до сих пор не понимаю что такое контекст. Например, возьмем старый добрый Toast
Toast.makeText(context, String, int);
Первый параметр статического метода makeText класса Toast - это контекст. Но я могу передать this (если вызов метода находится не дальше одного блока кода) или MainActivity.this (если имя класса-активности MainActivity), могу также передать getApplicationContext().
Так в чем разница? Почему в качестве контекста можно передать this? Это же ссылка на класс Есть ли случаи когда надо передать именно getApplicationContext? Почему контекст нужен везде, где происходит работа с интерфейсом? Почему любой виджет имеет конструктор, в который надо передать контекст? Что вообще такое контекст?
Последний вопрос я задал, так как по ходу написания остальных, я понял, что ничего о нем не знаю :)


Ответ

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

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

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