Android java что такое context

Context

Context – это объект, который предоставляет доступ к базовым функциям приложения: доступ к ресурсам, к файловой системе, вызов активности и т.д. Activity является подклассом Context, поэтому в коде мы можем использовать её как ИмяАктивности.this (напр. MainActivity.this), или укороченную запись this. Классы Service, Application и др. также работают с контекстом.

Доступ к контексту можно получить разными способами. Существуют такие методы как getApplicationContext(), getContext(), getBaseContext() или this, который упоминался выше, если используется в активности.

На первых порах не обязательно понимать, зачем он нужен. Достаточно помнить о методах, которые позволяют получить контекст и использовать их в случае необходимости, когда какой-нибудь метод или конструктор будет требовать объект Context в своих параметрах.

В свою очередь Context имеет свои методы, позволяющие получать доступ к ресурсам и другим объектам.

  • getAssets()
  • getResources()
  • getPackageManager()
  • getString()
  • getSharedPrefsFile()

Возьмём к примеру метод getAssets(). Ваше приложение может иметь ресурсы в папке assets вашего проекта. Чтобы получить доступ к данным ресурсам, приложение использует механизм контекста, который и отвечает доступность ресурсов для тех, кто запрашивает доступ — активность, служба и т.д. Аналогично происходит с методом getResources. Например, чтобы получить доступ к ресурсу цвета используется конструкция getResources().getColor(), которая может получить доступ к данным из файла res/colors.xml.

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

Через контекст можно узнать практически всю информацию о вашем приложении — имя пакета, класса и т.п.

Тем не менее, следует различать контекст в разных ситуациях. Допустим, у вас есть приложение с несколькими активностями. В манифесте можно прописать используемую тему как для всего приложения, так и для каждой активности в отдельности. Соответственно, выбор контекста повлияет на результат. Как правило, при использовании собственной темы предпочтительнее использовать контекст активности, а не приложения.

Очень часто начинающие программисты впадают в ступор, когда ключевое слово this не работает в анонимных классах, например, при щелчке кнопки. В этом случае, используйте полное имя класса перед ним.

При создании адаптеров для списков также обращаются к контексту.

Или ещё пример для адаптера в фрагменте ListFragment:

Здесь тоже следует быть внимательным, если используется своя тема для списка.

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

ContextCompat

В библиотеки совместимости появился свой класс для контекста ContextCompat. Он может вам пригодиться, когда студия вдруг подчеркнёт метод в старом проекте и объявит его устаревшим.

Допустим, мы хотим поменять цвет текста на кнопки.

Студия ругается, что нужно использовать новый вариант getColor(int, Theme). Заменим строчку.

Если посмотреть на исходники этого варианта, то увидим, что там тоже идёт вызов нового метода. Поэтому можно сразу использовать правильный вариант, если вы пишете под Marshmallow и выше.

Источник

Context в Android приложении

Что такое Context?

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

Читайте также:  Андроид для тех кому зачем

Кроме того, Context является проводником в систему, он может предоставлять ресурсы, получать доступ к базам данных, преференсам и т.д. Ещё в Android приложениях есть Activity . Это похоже на проводник в среду, в которой выполняется ваше приложение. Объект Activity наследует объект Context . Он позволяет получить доступ к конкретным ресурсам и информации о среде приложения.

Context присутствует практически повсюду в Android приложении и является самой важной его частью, поэтому необходимо понимать, как правильно его использовать.

Неправильное использование Context может легко привести к утечкам памяти в Android приложении.

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

Контекст приложения

Это singleton-экземпляр (единственный на всё приложение), и к нему можно получить доступ через функцию getApplicationContext() . Этот контекст привязан к жизненному циклу приложения. Контекст приложения может использоваться там, где вам нужен контекст, жизненный цикл которого не связан с текущим контекстом или когда вам нужно передать контекст за пределы Activity .

Например, если вам нужно создать singleton-объект для вашего приложения, и этому объекту нужен какой-нибудь контекст, всегда используйте контекст приложения.

Если вы передадите контекст Activity в этом случае, это приведет к утечке памяти, так как singleton-объект сохранит ссылку на Activity и она не будет уничтожена сборщиком мусора, когда это потребуется.

В случае, когда вам нужно инициализировать какую-либо библиотеку в Activity , всегда передавайте контекст приложения, а не контекст Activity .

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

Контекст Activity

Этот контекст доступен в Activity и привязан к её жизненному циклу. Контекст Activity следует использовать, когда вы передаете контекст в рамках Activity или вам нужен контекст, жизненный цикл которого привязан к текущему контексту.

getContext() в ContentProvider

Этот контекст является контекстом приложения и может использоваться аналогично контексту приложения. К нему можно получить доступ через метод getContext() .

Когда нельзя использовать getApplicationContext()?

Правило большого пальца

В большинстве случаев используйте контекст, доступный непосредственно из компонента, в котором вы работаете в данный момент. Вы можете безопасно хранить ссылку на него, если она не выходит за пределы жизненного цикла этого компонента. Как только вам нужно сохранить ссылку на контекст в объекте, который живет за пределами вашей Activity или другого компонента, даже временно, используйте ссылку на контекст приложения.

Источник

Context — контекст в android — что это, как получить и зачем использовать

Контекст (Context) – это базовый абстрактный класс, реализация которого обеспечивается системой Android. Этот класс имеет методы для доступа к специфичным для конкретного приложения ресурсам и классам и служит для выполнения операций на уровне приложения, таких, как запуск активностей, отправка широковещательных сообщений, получение намерений и прочее. От класса Context наследуются такие крупные и важные классы, как Application, Activity и Service, поэтому все его методы доступны из этих классов.


Получить контекст внутри кода можно одним из следующих методов:

  • getBaseContext(получить ссылку на базовый контекст)
  • getApplicationContext(получить ссылку на объект приложения)
  • getContext (внутри активности или сервиса получить ссылку на этот объект)
  • this(то же, что и getContext)
  • MainActivity.this (внутри вложенного класса или метода получить ссылку на объект MainActivity)
  • getActivity(внутри фрагмента получить ссылку на объект родительской активности)

Контекст (Context) – это базовый абстрактный класс, реализация которого обеспечивается системой Android. Этот класс имеет методы для доступа к специфичным для конкретного приложения ресурсам и классам и служит для выполнения операций на уровне приложения, таких, как запуск активностей, отправка широковещательных сообщений, получение намерений и прочее. От класса Context наследуются такие крупные и важные классы, как Application, Activity и Service, поэтому все его методы доступны из этих классов. Источник


Получить контекст внутри кода можно одним из следующих методов:

Источник

Русские Блоги

Понимание и применение контекста в разработке под Android

Когда дело доходит до контекста, можно сказать, что никто не знает, что делать с Android, например «XXXXActivity.this», «getApplicationContext ()», «getContext ()» и другими формами. Хотя все это знают, это также искусство — действительно хорошо им пользоваться.

Раньше в наш проект была добавлена ​​функция плавающего шара для получения WINDOW_SERVICE глобального приложения. Однако экземпляр плавающего шара использует контекст Activity. Проблема в том, что контекст повторно используется при повторном использовании памяти, в результате чего windowManager не может управлять им. Этот вид.

Читайте также:  Христианские темы для андроид

Эта статья резюмирует углубленное изучение Context.

Что такое контекст

Контекст, буквально переводимый с китайского как «контекст», описывает информацию о среде приложения, которая описывается в SDK следующим образом:

Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc

С точки зрения системы Android: Контекст — это сцена, представляющая процесс взаимодействия с операционной системой. Контекст должен участвовать в таких операциях, как загрузка ресурсов, запуск Activity, получение системных служб и создание представлений.

С точки зрения программы: контекст — это абстрактный класс, а действие, служба, приложение и т. Д. — все реализации этого класса.

Контекстное поведение

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

Классификация поведения контекста Общие функции
Воспользуйтесь услугами, предоставляемыми системой getPackageManager()、getSystemService()…
основные навыки startActivity (), sendBroadcast (), registerReceiver (), startService (), bindService (), getContentResolver () . [Внутренне это в основном имеет дело с AMS]
Доступ к ресурсам getAssets()、getResources()、getString()、getColor()、getClassLoader()…
Связь с текущим процессом getMainLooper()、getApplicationContext()…
Относится к хранению информации getSharedPreferences()、openFileInput()、openFileOutput()、deleteFile()、openOrCreateDatabase()、deleteDatabase()…

Спектр отношений контекста

Генеалогия Context в основном включает Context, ContextImpl, ContextWrapper, ContextThemeWrapper и конечные члены Application, Activity, Service.

Отношения между этими элементами показаны на следующем рисунке:

Из диаграммы наследования можно увидеть, что класс Application, класс Service и класс Activity наследуют класс Context. После запуска приложения для приложения будет создан глобальный объект Application Context. Класс ContextImpl — это реальная реализация Context. Класс ContextWrapper — это класс-оболочка для Context. Вы можете добавлять к нему некоторые пользовательские операции, не изменяя ContextImpl. MBase в ContextWrapper на самом деле является объектом ContextImpl. MOuterContext в классе ContextImpl является объектом контекста, указывающим на соответствующее действие, службу или приложение.

Это немного запутано? Это не имеет значения, давайте кратко проанализируем конкретные детали этих участников.

Введение в родственный класс

Context

Путь: /frameworks/base/core/java/android/content/Context.java
Описание: абстрактный класс, предоставляет набор общих API.

ContextIml

Путь: /frameworks/base/core/java/android/app/ContextImpl.java
Примечание. Класс реализации класса Context — это ContextIml, который реализует функции класса Context. Обратите внимание, что большинство функций этой функции вызываются напрямую, и ее свойство mPackageInfo выполнено, о чем мы поговорим позже.

ContextWrapper

Путь: \ frameworks \ base \ core \ java \ android \ content \ ContextWrapper.java
Примечание: как и его название, этот класс является просто оболочкой для класса Context.Конструктор этого класса содержит реальную ссылку на контекст, то есть объект ContextImpl.

ContextThemeWrapper

Путь: /frameworks/base/core/java/android/view/ContextThemeWrapper.java
Примечание. Этот класс содержит связанные с темой (Theme) интерфейсы, которые задаются атрибутом android: theme. Тема нужна только Activity, а Service не нужна тема, поэтому Service напрямую наследуется от класса ContextWrapper.

Время создания контекста

После знакомства с отношениями наследования контекста мы затем анализируем, когда приложению необходимо создавать объекты контекста.

Количество контекста

Существует несколько ситуаций, когда приложение создает экземпляр Context:

  • Когда создается объект Application, существует один объект Application для всего приложения.
  • При создании объекта Activity
  • При создании Сервисного объекта

Таким образом, формула количества контекстов, совместно используемых приложением-приложением, следующая:
Общее количество экземпляров контекста = 1 (экземпляр контекста, соответствующий приложению) + количество действий + количество услуг

Конкретное время создания

Когда создавать объект Application

Когда каждое приложение запускается в первый раз, оно сначала создает объект Application. Если для приложения ясно, что он запускает процесс Activity (startActivity), время для создания приложения — это создать метод handleBindApplication (), который находится в классе ActivityThread.java, как показано ниже:

Когда создавать объект Activity

При запросе запуска Activity через startActivity () или startActivityForResult (), если система обнаруживает, что необходимо создать новый объект Activity, она вызывает метод handleLaunchActivity (), который затем вызывает метод performLaunchActivity () для создания экземпляра Activity и обратного вызова onCreate. (), onStart () и т. д., функции расположены в классе ActivityThread.java следующим образом:

Когда создавать объект службы

При передаче startService или bindService, если система обнаруживает, что необходимо создать новый экземпляр службы, она вызывает метод handleCreateService ().
Завершение связанных операций с данными. Функция handleCreateService () находится в классе ActivityThread.java следующим образом:

Heavyweight PackageInfo

Следует подчеркнуть, что, анализируя ContextImp, мы можем видеть, что большинство операций его метода заключается в непосредственном вызове его атрибута mPackageInfo (класс атрибута
тип PackageInfo). Это показывает, что ContextImp — это легкий класс, а PackageInfo — настоящий тяжелый класс. И все экземпляры ContextIml в приложении соответствуют одному и тому же объекту packageInfo.

Метод контекста getSharedPreferences ()

Вот анализ того, как использовать Context для получения класса SharedPreferences. Класс SharedPreferences должен был использоваться всеми. Общий метод получения
Метод предназначен для получения объекта SharedPreferences на основе связанной информации путем вызова метода getSharedPreferences (). Конкретный процесс выглядит следующим образом:

1. Вызовите getSharedPreferences (), чтобы получить соответствующий файл. Функция этой функции следующая:

2. SharedPreferences — это просто интерфейс, он определяет некоторые методы для управления xml-файлами, его реальный класс реализации — SharedPreferencesImpl, этот класс является внутренним классом ContextIml, это следующий класс:

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

Как получить контекст

  1. View.getContext(), Возвращает объект Context процесса приложения, в котором находится текущее действие, обычно отображаемый в данный момент объект действия.
  2. Activity.getApplicationContext(), Получить объект Context процесса (приложения), в котором находится текущее действие. Обычно, когда мы используем объект Context, мы должны отдавать приоритет этому глобальному процессу Context.
  3. Activity.this, Возвращает текущий экземпляр Activity, если это элемент управления пользовательского интерфейса, вам нужно использовать Activity в качестве объекта Context, но тост по умолчанию — это Windows системного уровня, поэтому вы можете использовать ApplicationContext напрямую.
  4. getApplication(), И объект, полученный с помощью getApplicationContext, тот же, но метод getApplication может быть вызван только в Activity и Service. Например, если вам нужно получить приложение в BroadcasrReceiver, вам нужно использовать метод getApplicationContext ().

Сценарии использования контекста

Давайте сначала посмотрим на схему сцены использования контекста:

Все обращают внимание на то, что некоторые числа добавляются к НЕТ. На самом деле это ДА с точки зрения способностей, но почему НЕТ? Следующее объясняется одно за другим:

  • Номер 1: В этих классах возможно начало деятельности, но вам нужно создать новую задачу. Обычно не рекомендуется.
  • Номер 2: в этих классах разрешено использовать раскладку inflate, но будет использоваться системный стиль темы по умолчанию. Если вы настроите некоторые стили, он может не использоваться.
  • Число 3: Разрешено, когда получатель имеет значение NULL, в версии 4.2 или выше, используется для получения текущего значения липкой трансляции. (Можно игнорировать)

Примечание. Причина, по которой ContentProvider и BroadcastReceiver находятся в приведенной выше таблице, заключается в том, что существует контекст для использования в их внутренних методах.

Здесь мы смотрим на таблицу, сосредотачиваясь на Activity и Application, мы видим, что методы, связанные с UI, в основном не рекомендуются или не могут использоваться. Причем, первые три операции практически невозможно отобразить в Application. Фактически, пока вы понимаете одну точку, все связанные с пользовательским интерфейсом должны использовать Activity как Context для обработки; другие операции, Service, Activity, Application и другие экземпляры в порядке, конечно, обратите внимание на владение ссылками Context, чтобы Утечка памяти.

Если я, проводящий собеседование, спрашиваю вас, может ли Служба начинать деятельность, вы должны знать, как на это ответить.

Утечка памяти, вызванная контекстом

Утечка памяти, вызванная Context, также очень пугает. Вот два примера:

1. Неправильный одноэлементный шаблон

В этом случае, даже если действие уничтожено, поскольку его ссылка все еще существует в синглтоне, его нельзя отключить.

2. View содержит ссылку на активность

Существует статический объект Drawable.Когда ImageView устанавливает этот Drawable, ImageView сохраняет ссылку на mDrawable, а this, передаваемый ImageView, является mContext для MainActivity, поскольку mDrawable, измененный static, находится в памяти, MainActivity является его косвенной ссылкой. Когда MainActivity уничтожается, GC не может быть выключен, что вызывает утечку памяти.

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

  1. Если стиль темы Activity не задействован, попробуйте использовать Context of Application.
  2. Не позволяйте объектам с жизненным циклом дольше, чем Activity удерживать свои ссылки.
  3. Старайтесь не использовать нестатические внутренние классы в Activity, потому что нестатические внутренние классы будут неявно содержать ссылки на примеры внешних классов.Если вы используете статические внутренние классы, храните ссылки на внешние экземпляры как слабые ссылки.

Источник

Читайте также:  Проги для сканирования авто для андроид
Оцените статью