Разница между контекстом действия и контекстом приложения
Это меня озадачило, я использовал это в Android 2.1-R8 SDK:
ProgressDialog.show(getApplicationContext(), ....);
а также в
Toast t = Toast.makeText(getApplicationContext(),....);
используя getApplicationContext()
падает как ProgressDialog
и Toast
.... что приводит меня к следующему вопросу:--6-->
каковы фактические различия между контекстом деятельности и контекстом приложения, несмотря на совместное использование формулировки "контекст"?
7 ответов
Они оба являются экземплярами контекст, но экземпляр приложения привязан к жизненному циклу приложения, в то время как экземпляр действия привязан к жизненному циклу действия. Таким образом, они имеют доступ к различной информации о среде приложения.
Если Вы читаете документы в getApplicationContext он отмечает, что вы должны использовать это, только если вам нужен контекст, жизненный цикл которого отделен от текущего контекста. Это не применяется в любом из ваших примеров.
контекст действия предположительно содержит некоторую информацию о текущей деятельности, которая необходима для выполнения этих вызовов. Если вы покажете точное сообщение об ошибке, возможно, сможете указать, что именно ему нужно.
но в общем случае используйте контекст действия, если у вас нет веской причины не делать этого.
Я нашел эту таблицу очень полезной для решения, когда использовать различные типы контекстов:
- приложение может начать действие отсюда, но для этого необходимо создать новую задачу. Это может соответствовать конкретным случаям использования, но может создавать нестандартное поведение заднего стека в приложении и обычно не рекомендуется или считается хорошей практикой.
- это законно, но инфляция будет сделано по умолчанию тема для системы, на которой вы работаете, а не то, что определено в вашем приложении.
- разрешено, если приемник равен null, который используется для получения текущего значения липкой трансляции, на Android 4.2 и выше.
Оригинал статьи здесь.
это, очевидно, является недостатком дизайна API. Во-первых, контекст действия и контекст приложения-это совершенно разные объекты, поэтому параметры метода, в котором используется контекст, должны использовать ApplicationContext
или Activity
напрямую, вместо использования контекста родительского класса.
Во-вторых, документ должен указать, какой контекст использовать или не использовать явно.
причина, по которой я думаю, что ProgressDialog
прикрепляется к активности, которая подпирает ProgressDialog
поскольку диалог не может оставаться после того, как действие будет уничтожено, поэтому его нужно передать this
(ActivityContext), который также уничтожается с действием, тогда как ApplicationContext остается даже после уничтожения действия.
Я думаю, когда все нужно экран, чтобы показать (кнопка, диалог, макет...) мы должны использовать контекстную активность, и все не нуждается в экране,чтобы показать или обработать ( тост, сервисный телефон, контакт...) мы могли бы использовать контекст приложения
вы не можете отобразить окно/диалоговое окно приложения через контекст, который не является действием. Попробуйте передать допустимую ссылку на действие
используйте getApplicationContext () если вам нужно что-то привязанное к контексту, который сам будет иметь глобальную область.
Если вы используете Activity, то новый экземпляр Activity будет иметь ссылку, которая имеет неявную ссылку на старую Activity, а старая Activity не может быть собрана мусора.