Разница между контекстом работы и контекстом приложения
Это меня насторожило, я использовал это в 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 будет иметь ссылку, которая имеет неявную ссылку на старую активность, а старая активность не может быть собрана мусором.