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


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

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

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

7 236

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.Конструктор использует контекст приложения, и затем индикатор выполнения использует контекст действия. Это не объясняется 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 Ср. чтобы использовать контекст приложения только в случае необходимости, не кажется убедительным для меня без объяснения причин. Но кажется, что я нашел unswear почему:

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

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