вторник, 1 апреля 2014 г.

Контекст - что это?

Введение

Практика показывает, что смысл контекста в 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 и пр.

19 комментариев:

  1. Ответы
    1. Этот комментарий был удален администратором блога.

      Удалить
    2. Я новичек в разработке по Android.
      Не совсем понял смысл...
      Toast - это всплывающее сообщение. Оно отобразилось и исчезло.
      Что значит, "Будет видно даже после завершения приложения:"?

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

      И ещё, по поводу комментирования в блоге. Пишите, пожалуйста, не в ответе на чужой комментарий, а организовывайте свой, новый.

      Удалить
  2. Коротко и понятно! Дай бог вам здоровья)

    ОтветитьУдалить
  3. О, вот оно, наконец-то внятное и толковое объяснение, спасибо :))

    ОтветитьУдалить
  4. Спасибо, примеры с Toast и временем жизни - очень наглядно. Еще бы других подобных примерчиков)))

    ОтветитьУдалить
  5. Вот теперь уже понятно что такое Context. Спасибо большое

    ОтветитьУдалить
  6. Спасибо! Только после Вашего объяснение смог разобраться когда какое значение стоит передавать в поле контекст!

    ОтветитьУдалить