Когда вызывать контекст действия или контекст приложения?

было много сообщений о том, что представляют собой эти два контекста.. Но я все еще не совсем понимаю!--7-->

как я понимаю до сих пор: Каждый является экземпляром своего класса, что означает, что некоторые программисты рекомендуют использовать this.getApplicationContext() как можно чаще, чтобы не" утечка " из памяти. Это потому, что другой this (получение Activity контекст экземпляра) указывает на Activity это уничтожается каждый раз, когда пользователь наклоняет телефон или покидает приложение так далее.. Которая, видимо сборщик мусора (GC), не ловит и поэтому использует слишком много памяти..

но может ли кто-нибудь придумать некоторые действительно хорошие примеры кодирования, где было бы правильно использовать this (получение контекста текущего Activity экземпляр) и контекст приложения будет бесполезным / неправильным?

7 ответов


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

чтобы быть грубым," некоторые программисты " используют getApplicationContext() (или getBaseContext(), в меньшей степени), потому что их опыт Java ограничен. Они реализуют внутренний класс (например,OnClickListener на Button на Activity) и нужна Context. А не с помощью MyActivity.this чтобы добраться до внешнего класса'this, они используют getApplicationContext() или getBaseContext() и


Я думаю, что есть много вещей, которые плохо документированы на сайте SDK, это один из них. Утверждение, которое я собираюсь сделать, заключается в том, что кажется, что лучше по умолчанию использовать контекст приложения и использовать контекст действия только тогда, когда вам действительно нужно. Единственное место, где я когда-либо видел, что вам нужен контекст активности, - это диалог прогресса. SBERG412 утверждает, что вы должны использовать контекст действия для сообщения тоста, но документы Android четко показывают приложение контекст используется. Я всегда использовал контекст приложения для тостов из-за этого примера Google. Если это неправильно, то Google бросил мяч здесь.

вот больше, чтобы думать и обзор:

для сообщения тоста руководство Google Dev использует контекст приложения и явно говорит, чтобы использовать его: Всплывающие Уведомления

в разделе диалогов руководства по разработке вы видите, что AlertDialog.Builder использует контекст приложения и затем индикатор выполнения использует контекст действия. Это не объясняется Google. диалоги

похоже, что хорошая причина использовать контекст приложения - это когда вы хотите обрабатывать изменения конфигурации, такие как изменение ориентации, и вы хотите сохранить объекты, которым нужен контекст, например представления. Если вы посмотрите здесь: Изменения Времени Выполнения Существует предупреждение об использовании контекста действия, который может создать утечку. Этого можно избежать с помощью контекста приложения с представления, которые должны быть сохранены (по крайней мере, это мое понимание). В приложении, которое я пишу, я намерен использовать контекст приложения, потому что я пытаюсь удержать некоторые представления и другие вещи при изменении ориентации, и я все еще хочу, чтобы действие было уничтожено и воссоздано при изменении ориентации. Таким образом, я должен использовать контекст приложения, чтобы не вызвать утечку памяти (см. избежать утечек памяти). Мне кажется, что есть много веских причин использовать контекст приложения вместо контекст активности, и мне кажется, что вы будете использовать его чаще, чем контекст активности. Это то, что многие книги Android, которые я прошел, похоже, делают, и это то, что делают многие примеры Google, которые я видел.

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


я использовал эту таблицу в качестве руководства для использования различных типов связи, таких как контекст приложения (Я.е: getApplicationContext()) и контекст действия , и контекст BroadcastReceiver:

enter image description here

Оригинал статьи здесь для получения дополнительной информации.


какой контекст использовать?

существует два типа контекста:

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

  2. контекст действия связано с деятельностью и может быть уничтожено, если деятельность уничтожена-может быть несколько действий (более чем вероятно) с одним приложением. И иногда вам абсолютно нужна дескриптор контекста активности. Например, если вы запускаете новое действие, вам нужно использовать контекст действия в его намерении, чтобы новое запускающее действие связано с текущим действием с точки зрения стека действий. Однако вы также можете использовать контекст приложения для запуска нового действия, но затем вам нужно установить флаг Intent.FLAG_ACTIVITY_NEW_TASK в намерения рассматривать его как новую задачу.

давайте рассмотрим некоторые случаи:

  • MainActivity.this относится к контексту MainActivity, который расширяет класс Activity, но базовый класс (activity) также расширяет класс Context, поэтому его можно использовать для предложения контекст деятельности.

  • getBaseContext() предлагает контекста деятельности.

  • getApplication() предлагает приложения в контексте.

  • getApplicationContext() также предлагает контекст приложения.

для получения дополнительной информации, пожалуйста, проверьте этот ссылке.


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

ProgressDialog.show(this, ....);

или

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

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


контекст приложения live пока ваше приложение находится в живых только и это не зависит от жизненного цикла активности, но, контекст сохранить объект долгоживущий. Если объект, который вы используете временный, то используйте время Контекст Приложения и Контекст Действия используется полностью oposite контекста приложения.


Мне было интересно, почему бы не использовать контекст приложения для каждой операции, которую он поддерживает. В конце концов, это снижает вероятность утечки памяти и отсутствия нулевой проверки getContext() или getActivity() (при использовании введенного контекста приложения или приобретенного статическим методом из приложения). Утверждения, подобные тому, что Hackborn Ср. использовать контекст приложения только при необходимости, не кажется убедительным для меня без объяснения причин. Но, кажется, я нашел одежду почему:

обнаружили, что есть проблемы на некоторых Android версии / комбинации устройств, которые не следуют этим правилам. Например, если у меня есть BroadcastReceiver, который передается контекст, и я преобразую этот контекст в контекст приложения, а затем пытаюсь вызвать registerReceiver() в контексте приложения, есть много случаев, когда это работает нормально, но также много случаев, когда я получаю сбой из-за ReceiverCallNotAllowedException. Эти сбои происходят на широкий диапазон версий Android от API 15 до 22. https://possiblemobile.com/2013/06/context/#comment-2443283153

потому что не гарантируется, что все операции, описанные как поддерживаемые контекстом приложения в таблице ниже, будут работать на всех устройствах Android! enter image description here