Intereting Posts
Уменьшите внутреннюю логарифмическую логику ORMlite или отключите ее. Есть ли способ открыть файл как объект File из папки ресурсов Android? Proguard возвратила ошибку в библиотеке Служб Google Play Android ListView с различными макетами для каждой строки Android: проверьте, работает ли служба. bindService Плохая ошибка растрового изображения при настройке Uri Android: уведомление от BroadcastReceiver Корреспондент Кордовы отказался от запроса о кордове ios 4 Почему мое приложение начинает невероятно медленно (10 с +) при первом запуске, показывая только белый экран на Android 5.0? Как избежать таймаута сеанса в Android Что означает «уникальный посетитель» в контексте Google Analytics на Android? Использование 1.7 требует компиляции с Android 4.4 (KitKat); В настоящее время используется API 14 Как изменить настройки прокси-сервера в Android (особенно в Chrome) Вложенное Parcelling: RuntimeException – Unmarshalling неизвестный тип кода 3211319 при смещении 440 Как уменьшить конечную активность до прямоугольника

Разница между getContext (), getApplicationContext (), getBaseContext () и "this"

В чем разница между getContext() , getApplicationContext() , getBaseContext() и « this »?

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

Solutions Collecting From Web of "Разница между getContext (), getApplicationContext (), getBaseContext () и "this""

  • View.getContext() : возвращает контекст, в котором в настоящее время выполняется представление. Обычно активна в настоящий момент.

  • Activity.getApplicationContext() : возвращает контекст для всего приложения (процесс, в котором все действия запущены внутри). Используйте это вместо текущего контекста Activity, если вам нужен контекст, привязанный к жизненному циклу всего приложения, а не только текущая активность.

  • ContextWrapper.getBaseContext() : если вам нужен доступ к контексту из другого контекста, вы используете ContextWrapper. Контекст, на который ссылается изнутри, что ContextWrapper доступен через getBaseContext ().

GetApplicationContext () – возвращает контекст для всех действий, выполняемых в приложении.

GetBaseContext () – Если вы хотите получить доступ к Контексту из другого контекста в приложении, к которому вы можете получить доступ.

GetContext () – возвращает контекстное представление только текущей текущей активности.

Context предоставляет информацию о Actvity или Application для вновь созданных компонентов.

Соответствующий Context должен быть предоставлен вновь созданным компонентам (контекст приложения или контекст активности)

Поскольку Activity является подклассом Context , его можно использовать для получения контекста активности

Большинство ответов уже охватывают getContext() и getApplicationContext() но getBaseContext () редко объясняется.

Метод getBaseContext() применим только в том случае, если у вас есть ContextWrapper . Android предоставляет класс ContextWrapper , созданный вокруг существующего Context используя:

 ContextWrapper wrapper = new ContextWrapper(context); 

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

 ContextWrapper customTheme = new ContextWrapper(myActivity) { @Override public Resources.Theme getTheme() { return someTheme; } } View myView = new MyView(customTheme); 

ContextWrapper действительно эффективен, потому что он позволяет вам переопределить большинство функций, предоставляемых Context включая код для доступа к ресурсам (например, openFileInput() , getString() ), взаимодействовать с другими компонентами (например, sendBroadcast() , registerReceiver() ), разрешениями на запросы (например, checkCallingOrSelfPermission() ) И разрешения расположения файловой системы (например, getFilesDir() ). ContextWrapper действительно полезен для решения проблем, связанных с устройством / версией, или для применения одноразовых настроек для таких компонентов, как представления, требующие контекста.

Метод getBaseContext () может использоваться для доступа к «базовому» контексту, который обтекает ContextWrapper . Возможно, вам придется обратиться к «базовому» контексту, если вам нужно, например, проверить, является ли это Service , Activity или Application :

 public class CustomToast { public void makeText(Context context, int resId, int duration) { while (context instanceof ContextWrapper) { context = context.baseContext(); } if (context instanceof Service)) { throw new RuntimeException("Cannot call this from a service"); } ... } } 

Или если вам нужно вызвать «развернутую» версию метода:

 class MyCustomWrapper extends ContextWrapper { @Override public Drawable getWallpaper() { if (BuildInfo.DEBUG) { return mDebugBackground; } else { return getBaseContext().getWallpaper(); } } } 

Вопрос «что такое контекст» является одним из самых сложных вопросов в Android-юниверсе.

Контекст определяет методы, которые обращаются к системным ресурсам, извлекают статические активы приложения, проверяют разрешения, выполняют манипуляции с пользовательским интерфейсом и многое другое. По сути, Context является примером анти-шаблона Бога-объекта в производстве.

Когда дело доходит до того, какой тип Context мы должны использовать, он становится очень сложным, потому что, за исключением объекта God, дерево иерархии подклассов Context жестоко нарушает принцип замещения Лискова.

Это сообщение в блоге пытается обобщить применимость классов Context в разных ситуациях.

Позвольте мне скопировать основную таблицу из этой публикации для полноты:

Введите описание изображения здесь

Из этих документов

Я понял, что вы должны использовать:

Попробуйте использовать контекстное приложение вместо контекстной активности

getApplicationContext ()

Это используется для уровня приложения и относится ко всем видам деятельности.

GetContext () и getBaseContext ()

Это, скорее всего, одно и то же. В них выражается только текущая деятельность, которая является живой.

это

Всегда ссылается на текущий объект класса.