Введение
Практика показывает, что смысл контекста в Android не всегда прозрачен. Определения контекста слишком абстрактны, разнятся от источника к источнику, и не дают возможности чётко осмыслить, что же это за сущность такая. Я постарался собрать разрозненную информацию о контексте и привести её к единому виду.
Контекст (Context) – это базовый абстрактный класс, реализация которого обеспечивается системой Android. Этот класс имеет методы для доступа к специфичным для конкретного приложения ресурсам и классам и служит для выполнения операций на уровне приложения, таких, как запуск активностей, отправка широковещательных сообщений, получение намерений и прочее. От класса Context наследуются такие крупные и важные классы, как Application, Activity и Service, поэтому все его методы доступны из этих классов.
Получить контекст внутри кода можно одним из следующих методов:
Как было сказано выше, контекст является базовым классом для классов Application, Activity и Service, а значит его методы входят в их состав. Именно поэтому для передачи контекста в качестве параметра можно использовать как ссылку на сам контекст (getBaseContext), так и ссылки на наследуемые классы (getApplicationContext, getContext, this, MainActivity.this, getActivity).
Но тут важно понимать, что время жизни этих ссылок будет разное. Ссылка на переданный объект будет работать, пока будет жить этот объект. Поэтому в качестве контекста важно передать такую ссылку, которая будет рабочей на всём протяжении работы вызываемого метода.
Например, если вызвать сообщение с помощью Toast, используя разные context, то:
Сообщение умрёт вместе с активностью:
Toast.makeText(this, "Text", Toast.LENGTH_SHORT).show();
Сообщение умрёт вместе с приложением:
Toast.makeText(getApplicationContext(), "Text ", Toast.LENGTH_SHORT).show();
Будет видно даже после завершения приложения:
Toast.makeText(getBaseContext(), "Text ", Toast.LENGTH_SHORT).show();
Итак, контекст можно представить, как набор функций для работы на уровне приложения, вошедший в состав таких крупных классов, как Application, разных видов Activity, Service и пр.
Практика показывает, что смысл контекста в Android не всегда прозрачен. Определения контекста слишком абстрактны, разнятся от источника к источнику, и не дают возможности чётко осмыслить, что же это за сущность такая. Я постарался собрать разрозненную информацию о контексте и привести её к единому виду.
Определение контекста
Контекст (Context) – это базовый абстрактный класс, реализация которого обеспечивается системой Android. Этот класс имеет методы для доступа к специфичным для конкретного приложения ресурсам и классам и служит для выполнения операций на уровне приложения, таких, как запуск активностей, отправка широковещательных сообщений, получение намерений и прочее. От класса Context наследуются такие крупные и важные классы, как Application, Activity и Service, поэтому все его методы доступны из этих классов.
Методы получения контекста и их различие
Получить контекст внутри кода можно одним из следующих методов:
- getBaseContext (получить ссылку на базовый контекст)
- getApplicationContext (получить ссылку на объект приложения)
- getContext (внутри активности или сервиса получить ссылку на этот объект)
- this (то же, что и getContext)
- MainActivity.this (внутри вложенного класса или метода получить ссылку на объект MainActivity)
- getActivity (внутри фрагмента получить ссылку на объект родительской активности)
Все эти способы дадут нам возможность получить ссылку на объект, содержащий методы класса Context.
Как было сказано выше, контекст является базовым классом для классов Application, Activity и Service, а значит его методы входят в их состав. Именно поэтому для передачи контекста в качестве параметра можно использовать как ссылку на сам контекст (getBaseContext), так и ссылки на наследуемые классы (getApplicationContext, getContext, this, MainActivity.this, getActivity).
Но тут важно понимать, что время жизни этих ссылок будет разное. Ссылка на переданный объект будет работать, пока будет жить этот объект. Поэтому в качестве контекста важно передать такую ссылку, которая будет рабочей на всём протяжении работы вызываемого метода.
Например, если вызвать сообщение с помощью Toast, используя разные context, то:
Сообщение умрёт вместе с активностью:
Toast.makeText(this, "Text", Toast.LENGTH_SHORT).show();
Сообщение умрёт вместе с приложением:
Toast.makeText(getApplicationContext(), "Text ", Toast.LENGTH_SHORT).show();
Будет видно даже после завершения приложения:
Toast.makeText(getBaseContext(), "Text ", Toast.LENGTH_SHORT).show();
То есть, мы видим, что хотя контекст одинаков у разных объектов, сами эти объекты могут жить разное время.
Заключение
Итак, контекст можно представить, как набор функций для работы на уровне приложения, вошедший в состав таких крупных классов, как Application, разных видов Activity, Service и пр.
Спасибо за объяснение.
ОтветитьУдалитьПожалуйста! )
УдалитьЭтот комментарий был удален администратором блога.
УдалитьЯ новичек в разработке по Android.
УдалитьНе совсем понял смысл...
Toast - это всплывающее сообщение. Оно отобразилось и исчезло.
Что значит, "Будет видно даже после завершения приложения:"?
Может, не совсем удачный пример. Но смысл его в том, что пока сообщение отображается, можно закрыть программу, и сообщение не прервёт своего показа до истечения времени показа.
УдалитьИ ещё, по поводу комментирования в блоге. Пишите, пожалуйста, не в ответе на чужой комментарий, а организовывайте свой, новый.
Коротко и понятно! Дай бог вам здоровья)
ОтветитьУдалитьСпасибо! )
УдалитьО, вот оно, наконец-то внятное и толковое объяснение, спасибо :))
ОтветитьУдалитьПожалуйста! )
УдалитьСпасибо, примеры с Toast и временем жизни - очень наглядно. Еще бы других подобных примерчиков)))
ОтветитьУдалитьБлагодарю за отзыв. Пожелание учту )
УдалитьСпасибо за статью
ОтветитьУдалитьПожалуйста! :-)
УдалитьВот теперь уже понятно что такое Context. Спасибо большое
ОтветитьУдалитьПожалуйста! )
УдалитьСпасибо! Только после Вашего объяснение смог разобраться когда какое значение стоит передавать в поле контекст!
ОтветитьУдалитьПожалуйста! )
УдалитьОт души!
ОтветитьУдалитьугу, спс.
Удалить