Что такое «контекст» на Android? - PullRequest
1794 голосов
/ 26 августа 2010

В программировании на Android что такое класс Context и для чего он используется?

Я читал об этом на сайте разработчика , но не могу понятьясно.

Ответы [ 28 ]

1385 голосов
/ 26 августа 2010

Проще говоря:

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

Вы можете получить контекст, вызвав getApplicationContext(), getContext(), getBaseContext() или this (в классе, который расширяется от Context, например в классах Application, Activity, Service и IntentService).

Типичное использование контекста:

  • Создание новых объектов : Создание новых видов, адаптеров, слушателей:

    TextView tv = new TextView(getContext());
    ListAdapter adapter = new SimpleCursorAdapter(getApplicationContext(), ...);
    
  • Доступ к стандартным общим ресурсам : Такие службы, как LAYOUT_INFLATER_SERVICE, SharedPreferences:

    context.getSystemService(LAYOUT_INFLATER_SERVICE)
    getApplicationContext().getSharedPreferences(*name*, *mode*);
    
  • Неявный доступ к компонентам : Относительно контент-провайдеров, трансляций, намерений

    getApplicationContext().getContentResolver().query(uri, ...);
    
465 голосов
/ 20 августа 2013

Определение контекста

  • Контекст представляет данные среды
  • Предоставляет доступ к таким вещам, как базы данных

Упрощенные термины (пример 1)

  • Представьте себе, что Person-X является генеральным директором начинающей софтверной компании.

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

  • Теперь генеральный директор нанимает нового разработчика.

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

Упрощенные термины (пример 2)

  • Это похоже на доступ активности Android к ресурсу приложения.

  • Это похоже на посещение отеля, когда вы хотите завтракать, обедать и ужин в подходящее время, верно?

  • Есть много других вещей, которые вам нравятся во время пребывания. Как ты получить эти вещи?

  • Вы просите сотрудника по обслуживанию номеров принести эти вещи для вас.

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


Вещи, связанные с контекстом:

  1. Загрузка ресурса.
  2. Запуск нового действия.
  3. Создание видов.
  4. получение системного сервиса.

Контекст - это базовый класс для Активность , Сервис , Приложение и т. Д.

Еще один способ описать это: рассматривать контекст как удаленный от телевидения, а каналы в телевизоре - это ресурсы, услуги, использование намерений и т. Д. на переднем плане.

  • Таким образом, Remote имеет доступ к таким каналам, как ресурсы, услуги, использование намерений и т. Д. Аналогично ... Тот, кто имеет доступ к удаленному, естественно, имеет доступ ко всем вещам, таким как ресурсы, услуги, использование намерений и т. Д.


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

  • getApplicationContext()
  • getContext()
  • getBaseContext()
  • или this (в классе занятий)

Пример:

TextView TV=new TextView(this);

this -> относится к контексту текущей деятельности.

308 голосов
/ 30 апреля 2013

Источник


Тема контекста в Android многих сбивает с толку.Люди просто знают, что контекст необходим довольно часто для выполнения основных задач в Android.Люди иногда впадают в панику, потому что они пытаются выполнить какую-то операцию, которая требует контекста, и они не знают, как «получить» правильный контекст.Я собираюсь попытаться демистифицировать идею контекста в Android.Полное рассмотрение проблемы выходит за рамки этого поста, но я постараюсь дать общий обзор, чтобы у вас было представление о том, что такое контекст и как его использовать.Чтобы понять, что такое контекст, давайте взглянем на исходный код:

https://github.com/android/platform_frameworks_base/blob/master/core/java/android/content/Context.java

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

Ну,Сама документация дает довольно простое объяснение: класс Context является «интерфейсом к глобальной информации о среде приложения».

Сам класс Context объявляется как абстрактный класс, реализация которого обеспечивается ОС Android.Документация также предусматривает, что Контекст «… разрешает доступ к ресурсам и классам, относящимся к конкретному приложению, а также к дополнительным вызовам для операций на уровне приложения, таких как действия по запуску, широковещательные и приемные намерения и т. д.».

Теперь вы можете очень хорошо понять, почему имя называется Context.Это потому, что это просто так.Контекст предоставляет ссылку или ловушку, если хотите, для Действия, Сервиса или любого другого компонента, тем самым связывая его с системой, обеспечивая доступ к глобальной среде приложения.Другими словами: Контекст дает ответ на вопрос компонентов: «Где я, черт возьми, по отношению к приложению в целом и как я могу получить доступ к общему приложению и общаться с ним?». Если все это немного сбивает с толку, быстроПосмотрите на методы, предоставляемые классом Context, вы получите некоторые дополнительные сведения о его истинной природе.

Вот случайная выборка этих методов:

  1. getAssets()
  2. getResources()
  3. getPackageManager()
  4. getString()
  5. getSharedPrefsFile()

Что общего у всех этих методов?Все они позволяют любому, кто имеет доступ к контексту, иметь доступ к ресурсам всего приложения.

Контекст, другими словами, перехватывает компонент, имеющий ссылку на него, в остальную среду приложения.Например, ресурсы (например, папка «/ assets» в вашем проекте) доступны по всему приложению при условии, что Activity, Сервис или кто-либо еще знает, как получить доступ к этим ресурсам.То же самое касается getResources(), который позволяет делать такие вещи, как getResources().getColor(), который подключит вас к ресурсу colors.xml (не говоря уже о том, что aapt разрешает доступ к ресурсам через код Java, это отдельная проблема).

В результате, Context - это то, что обеспечивает доступ к системным ресурсам и то, что подключает компоненты к «большему приложению». Давайте рассмотрим подклассы Context, классы, которые обеспечивают реализациюабстрактный класс Context. Наиболее очевидным классом является класс Activity. Activity наследуется от ContextThemeWrapper, который наследуется от ContextWrapper, который наследуется от самого Context. Эти классы полезны для понимания, чтобы понятьвещи на более глубоком уровне, но на данный момент достаточно знать, что ContextThemeWrapper и ContextWrapper в значительной степени похожи на то, как они звучат. Они реализуют абстрактные элементы самого класса Context, «оборачивая» контекст (фактическийконтекст) и делегирование этих функций этому контексту. Пример полезен - в классе ContextWrapper абстрактный метод getAssets из класса Context реализован следующим образом:

@Override
    public AssetManager getAssets() {
        return mBase.getAssets();
    }

mBase это просто поле, установленное конструктором для определенного контекста, поэтому контекст переносится, и ContextWrapper делегирует его реализациюметода getAssets для этого контекста.Давайте вернемся к рассмотрению класса Activity, который в конечном итоге наследуется от Context, чтобы увидеть, как все это работает.

Вы, наверное, знаете, что такое активность, бОбзор - это, по сути, «единственное, что может сделать пользователь. Он заботится о предоставлении окна для размещения пользовательского интерфейса, с которым взаимодействует пользователь ». Разработчики, знакомые с другими API-интерфейсами, и даже не разработчики могут воспринимать его как «экран». Это технически неточно, но для наших целей это не имеет значения. Так как же взаимодействуют Activity и Context и что именно происходит в их наследственных отношениях?

Опять же, полезно взглянуть на конкретные примеры. Мы все знаем, как начать деятельность. При условии, что у вас есть «контекст», из которого вы начинаете действие, вы просто звоните startActivity(intent), где Intent описывает контекст, из которого вы запускаете действие, и действие, которое вы хотите начать. Это знакомый startActivity(this, SomeOtherActivity.class).

А что такое this? this - это ваша активность, потому что класс Activity наследуется от Context. Полный цикл выглядит так: когда вы вызываете startActivity, в конечном итоге класс Activity выполняет что-то вроде этого:

Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode);

Таким образом, он использует execStartActivity из Instrumentation класса (фактически из внутреннего класса в Instrumentation, называемого ActivityResult).

На этом этапе мы начинаем изучать внутренние компоненты системы.

Здесь ОС фактически обрабатывает все. Так, как Инструментарий точно начинает Деятельность? Итак, параметр this в методе execStartActivity, описанном выше, - это ваша активность, т.е. контекст, и execStartActivity использует этот контекст.

Обзор 30 000 заключается в следующем: класс Instrumentation отслеживает список операций, которые он отслеживает для выполнения своей работы. Этот список используется для координации всех действий и обеспечения бесперебойной работы потока операций.

Есть некоторые операции, которые я не полностью изучил, для координации потока и проблем процесса. В конечном счете, ActivityResult использует собственную операцию - ActivityManagerNative.getDefault().startActivity(), которая использует Context, который вы передали при вызове startActivity. Контекст, который вы передали, используется для «разрешения намерений», если это необходимо. Умышленное разрешение - это процесс, с помощью которого система может определить цель намерения, если оно не предоставлено. (Смотрите руководство здесь для более подробной информации).

И для того, чтобы Android это делал, ему необходим доступ к информации, предоставляемой Context. В частности, система должна иметь доступ к ContentResolver, чтобы она могла «определять MIME-тип данных намерения». Весь этот бит о том, как startActivity использует контекст, был немного сложным, и я сам не до конца понимаю внутренности. Моя основная цель состояла в том, чтобы просто показать, как нужно обращаться к ресурсам всего приложения, чтобы выполнять многие операции, которые важны для приложения. Context - это то, что обеспечивает доступ к этим ресурсам. Более простой пример может быть Views. Мы все знаем, что вы создаете пользовательский вид, расширяя RelativeLayout или какой-либо другой класс View, вы должны предоставить конструктор, который принимает Context в качестве аргумента. Когда вы создаете экземпляр своего пользовательского представления, вы переходите в контекст. Зачем? Поскольку представление должно иметь доступ к темам, ресурсам и другим деталям конфигурации представления. Просмотр конфигурации на самом деле отличный пример. Каждый контекст имеет различные параметры (поля в реализациях Context), которые устанавливаются самой ОС для таких вещей, как размер или плотность отображения. Легко понять, почему эта информация важна для настройки представлений и т. Д.

Последнее слово: По какой-то причине люди, плохо знакомые с Android (и даже не новички), похоже, полностью забывают об объектно-ориентированном программировании, когда дело доходит до Android. По какой-то причине люди пытаются склонить свои разработки под Android к заранее продуманным парадигмам или изученному поведению.

У Android есть своя собственная парадигма иd определенный шаблон, который на самом деле вполне согласован, если отпустить ваши предвзятые представления и просто прочитать документацию и руководство разработчика. Моя реальная точка зрения, однако, хотя «получение правильного контекста» может иногда быть хитрым, люди неоправданно паникуют, потому что сталкиваются с ситуацией, когда им нужен контекст, и думают, что его нет. Еще раз, Java является объектно-ориентированным языком с дизайном наследования.

Вы только «имеете» контекст внутри своей Деятельности, потому что ваша активность сама наследуется от Контекста. В этом нет ничего волшебного (кроме всего того, что сама ОС делает для установки различных параметров и для правильной «настройки» вашего контекста). Таким образом, оставляя в стороне проблемы с памятью / производительностью (например, удерживая ссылки на контекст, когда вам это не нужно, или делая это таким образом, что это имеет негативные последствия для памяти и т. Д.), Context - это объект, подобный любому другому, и его можно передавать как и любой POJO (обычный старый объект Java). Иногда вам может потребоваться сделать что-то умное для извлечения этого контекста, но любой обычный класс Java, который расширяется из ничего, кроме самого объекта, может быть написан так, чтобы иметь доступ к контексту; просто предоставьте открытый метод, который принимает контекст, а затем используйте его в этом классе по мере необходимости. Это не было задумано как исчерпывающий подход к Context или внутренним компонентам Android, но я надеюсь, что это немного поможет в демистификации Context.

112 голосов
/ 26 августа 2010

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

Для получения дополнительной информации см. Введение в разработку Android с помощью Android Studio - руководство.

79 голосов
/ 28 декабря 2012

Context - это «интерфейс» к глобальной информации о среде приложения.На практике Context на самом деле является абстрактным классом , реализация которого обеспечивается системой Android.

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

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

Activity diagram

65 голосов
/ 28 апреля 2012

Что именно Context точно?

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

Из книги " Android на практике ", стр.60.

Некоторым API-интерфейсам Android требуется Context в качестве параметра

Если вы посмотрите различные API-интерфейсы Android, вы заметите, что многие из них принимают android.content.Context объект в качестве параметра.Вы также увидите, что действие или служба обычно используется как Context.Это работает, потому что оба этих класса расширяются от Context.

44 голосов
/ 26 августа 2010

Android Контекст - это Интерфейс (в общем смысле, не в смысле Java; в Java Context на самом деле является абстрактным классом!), Который обеспечивает доступ кресурсы, классы и информация о приложении.

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

Ваши действия и службы также расширяются Context, поэтому они наследуют все эти методы для доступа к информации об окружающей среде, в которой работает приложение.

40 голосов
/ 02 мая 2016

Простой пример, чтобы понять context в Android:

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

В этом сценарии

Босс - это приложение для Android

Помощник - это контекст

Файлы / Чашка кофе - это ресурсы

Обычно мы называем контекст, когда нам нужно получить информацию о различных частях нашего приложения, таких как «Действия», «Приложения» и т. Д.

Некоторые операции (вещи, где требуется помощник), где задействован контекст:

  • Загрузка общих ресурсов
  • Создание динамических представлений
  • Отображение сообщений Toast
  • Запуск мероприятий и т. Д.

Различные способы получения контекста:

getContext()

getBaseContext()

getApplicationContext()

this
26 голосов
/ 02 мая 2017
  • Context представляет дескриптор для получения данных среды.
  • Context сам класс объявлен как абстрактный, реализация которого обеспечивается ОС Android.
  • Context это как пульт от телевизора, а на телевидении есть ресурсы, услуги и т. д. enter image description here

Что вы можете с этим сделать?

  • Загрузка ресурса.
  • Запуск нового действия.
  • Создание представлений.
  • Получение системной службы.

Способы получения контекста:

  • getApplicationContext()
  • getContext()
  • getBaseContext()enter image description hereenter image description here
16 голосов
/ 09 мая 2013

Просто выкладываю это для новичков;

Итак, сначала поймите, контекст Word:

In english-lib.это означает:

«Обстоятельства, которые формируют обстановку для события, утверждения или идеи, и с точки зрения которых она может быть полностью понята и оценена».

«части чего-либо написанного или произнесенного, которые непосредственно предшествуют и следуют за словом или отрывком и проясняют его значение. "

Теперь примените то же понимание к миру программирования:

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

Вы можете получить контекст, вызвав getApplicationContext(), getContext(), getBaseContext() или this (находясь в классе действия).

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

Создайте новый класс AppContext внутри приложения Android

public class AppContext extends Application {

    private static Context context;

    public void onCreate(){
        super.onCreate();
        AppContext.context = getApplicationContext();
    }

    public static Context getAppContext() {
        return AppContext.context;
    }
}

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

Надеюсь, эта помощь;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...