Разница между контекстом работы и контекстом приложения

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

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

а также в

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

с помощью getApplicationContext() выдает сбой как ProgressDialog, так и Toast...., которые приводят меня к этому вопросу:

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

Ответ 1

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

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

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

Но, в общем, используйте контекст активности, если у вас нет веских оснований.

Ответ 2

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

введите описание изображения здесь

  • Приложение может начать работу здесь, но для этого требуется создать новую задачу. Это может соответствовать конкретным вариантам использования, но может создавать нестандартные поведения в обратном стеке в вашем приложении и обычно не рекомендуется или считается хорошей практикой.
  • Это законно, но инфляция будет производиться с помощью темы по умолчанию для системы, на которой вы работаете, а не на то, что определено в вашем приложении.
  • Разрешено, если приемник имеет значение null, которое используется для получения текущего значения липкой трансляции, на Android 4.2 и выше.

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

Вы не можете отобразить окно/диалог приложения через контекст, который не является активностью. Попробуйте передать действительную ссылку на действия

Ответ 7

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

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