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

Это меня озадачило, я использовал это в Android 2.1-R8 SDK:

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

а также в

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

используя getApplicationContext() падает как ProgressDialog и Toast .... что приводит меня к следующему вопросу:--6-->

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

7 ответов


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

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

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

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


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

enter image description here

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

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


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


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


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


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


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

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