Разница между контекстом активности и контекстом приложения - PullRequest
218 голосов
/ 09 ноября 2010

Это поставило меня в тупик, я использовал это в Android 2.1-r8 SDK:

ProgressDialog.show(getApplicationContext(), ....);

, а также в

Toast t = Toast.makeText(getApplicationContext(),....);

, используя getApplicationContext(), сбой ProgressDialog иToast .... что привело меня к этому вопросу:

Каковы фактические различия между контекстом активности и контекстом приложения, несмотря на то, что они разделяют формулировку «Контекст»?

Ответы [ 6 ]

231 голосов
/ 09 ноября 2010

Они оба являются экземплярами Context , но экземпляр приложения привязан к жизненному циклу приложения, а экземпляр Activity связан с жизненным циклом действия. Таким образом, они имеют доступ к разной информации о среде приложения.

Если вы читаете документы по адресу getApplicationContext , он отмечает, что вы должны использовать это, только если вам нужен контекст, жизненный цикл которого отделен от текущего контекста. Это не относится ни к одному из ваших примеров.

В контексте действия предположительно имеется некоторая информация о текущей активности, необходимая для завершения этих вызовов. Если вы покажете точное сообщение об ошибке, возможно, сможете указать, что именно ему нужно.

Но в целом используйте контекст действия, если у вас нет веских причин не делать это.

147 голосов
/ 04 февраля 2016

Я нашел эту таблицу очень полезной для решения, когда использовать различные типы контекстов:

enter image description here

  1. Приложение МОЖЕТ запустить действие изздесь, но это требует создания новой задачи.Это может соответствовать конкретным случаям использования, но может создавать нестандартное поведение стека в вашем приложении и, как правило, не рекомендуется или считается хорошей практикой.
  2. Это законно, но инфляция будет выполняться с темой по умолчанию длясистема, в которой вы работаете, а не то, что определено в вашем приложении.
  3. Разрешено, если получатель имеет нулевое значение, которое используется для получения текущего значения липкой трансляции, на Android 4.2 и выше.

Оригинальная статья здесь .

28 голосов
/ 30 июня 2014

Это явно недостаток дизайна API.Во-первых, Контекст действия и Контекст приложения - это совершенно разные объекты, поэтому параметры метода, в которых используется контекст, должны использовать ApplicationContext или Activity напрямую, а не родительский класс Context.Во-вторых, в документе следует указать, какой контекст использовать или нет явно.

11 голосов
/ 25 июля 2014

Причина, по-моему, заключается в том, что ProgressDialog присоединено к действию, которое поддерживает ProgressDialog, поскольку диалоговое окно не может остаться после уничтожения действия, поэтому его необходимо передать this (ActivityContext), который также будет уничтоженс действием, тогда как ApplicationContext остается даже после того, как действие будет уничтожено.

1 голос
/ 04 мая 2015

Я думаю, что когда все нужно, чтобы показать экран (кнопка, диалог, макет ...), мы должны использовать контекстную активность, и все не нуждается в экране, чтобы показать или обработать (тост, служебный телефон, контакт ...) мы могли бы использовать контекст приложения

0 голосов
/ 04 марта 2016

Используйте getApplicationContext (), если вам нужно что-то привязать к контексту, который сам будет иметь глобальную область действия.

Если вы используете Activity, то у нового экземпляра Activity будет ссылка, которая имеет неявную ссылку настарая активность, а старая активность не может быть собрана сборщиком мусора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...