Context – контекст в android – что это, как получить и зачем использовать

[:ru] 

Контекст (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.

[:en] 

Контекст (Context) – это базовый абстрактный класс, реализация которого обеспечивается системой Android. Этот класс имеет методы для доступа к специфичным для конкретного приложения ресурсам и классам и служит для выполнения операций на уровне приложения, таких, как запуск активностей, отправка широковещательных сообщений, получение намерений и прочее. От класса Context наследуются такие крупные и важные классы, как Application, Activity и Service, поэтому все его методы доступны из этих классов. Источник

Методы получения контекста и их различие


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

  • getBaseContext (получить ссылку на базовый контекст)
  • getApplicationContext (получить ссылку на объект приложения)
  • и(внутри активности или сервиса получить ссылку на этот объект)
  • 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.

[:]

Коментарі: 5
  1. Дмитрий

    Здравствуйте! В статье ошибка, в списке методов получения контекста вместо getContextи
    Большое спасибо за уроки!

    1. admin (автор)

      Спасибо, исправлено.

  2. Владислав

    Добрый день. Я наверное не совсем до конца понимаю, но при использовании Toast.makeText(this, «Text», Toast.LENGTH_SHORT).show(); сообщение не умирает вместе в активностью. Я в onCreate поместил вот такой код:
    Toast.makeText(this, “This is toast”, Toast.LENGTH_LONG).show();
    finish();
    и при запуске активити сразу же умирает, а Toast остается видным. Объясните что я делаю не так?

    1. Дмитрий Марков

      Метод finish() завершает активити, а не тост.

Додати коментар