Вопрос: Что такое «Контекст» на Android?


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

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


1535


источник


Ответы:


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

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

Вы можете получить контекст, вызвав 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, ...);
    

1209



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

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

Упрощенные условия ::

  • Рассмотрим, что Person-X является генеральным директором компании-разработчика программного обеспечения.

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

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

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

Упрощенные условия ::

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

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

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

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

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


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

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

Контекст - это базовый класс для Мероприятия , обслуживание , заявка .... и т.д

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

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

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

  • getApplicationContext()
  • getContext()
  • getBaseContext()
  • или this(когда в классе активности)

Пример:

TextView TV=new TextView(this);

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


397



Источник


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

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

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

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

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

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

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

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

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

Другими словами, контекст перехватывает компонент, который ссылается на него, на остальную среду приложения. Например, в вашем приложении доступны ресурсы (думаю, «/ активы» в вашем проекте), при условии, что активность, служба или кто-то знает, как получить доступ к этим ресурсам. То же самое касается 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чтобы увидеть, как все это работает.

Вероятно, вы знаете, что такое Activity, но для обзора - это в основном «единственная вещь, которую пользователь может сделать. Он заботится о предоставлении окна для размещения пользовательского интерфейса, с которым пользователь взаимодействует. Разработчики, знакомые с другими 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).

На этом этапе мы начинаем заглядывать в внутреннюю систему.

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

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

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

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

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

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

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


243



A Context is a handle to the system; it provides services like resolving resources, obtaining access to databases and preferences, and so on. An Android app has activities. Context is like a handle to the environment your application is currently running in. The activity object inherits the Context object.

For more information, look in Introduction to Android development with Android Studio - Tutorial.


96



As long as your going to be thinking anyway, think big.

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.

Activity diagram


64



ANDROID AND CONTEXT

If you look through the various Android APIs, you’ll notice that many of them take an android.content.Context object as a parameter. You’ll also see that an Activity or a Service is usually used as a Context. This works because both of these classes extend from Context.

What’s Context exactly?

Per the Android reference documentation, it’s an entity that represents various environment data. It provides access to local files, databases, class loaders associated to the environment, services including system-level services, and more. Throughout this book, and in your day-to- day coding with Android, you’ll see the Context passed around frequently. From: "Android in Practice" book.


56



An Android Context is an Interface that allows access to application specific resources and class and information about application environment.

If your android app was a web app, your context would be something similar to ServletContext ( I am not making an exact comparison here)

Your activities and services also extend Context to they inherit all those methods to access the environment information in which the app is running.


35



Simple Example to understand context in android :

Every boss has an assistant to look after, to do all less important and time consuming tasks. If a file or a cup of coffee is needed, assistant is on the run. Some bosses barely know what’s going on in the office, so they ask their assistants regarding this too. They do some work themselves but for most other things they need help of their assistants.

In this scenario,

Boss – is the Android application

Assistant – is context

Files/Cup of coffee – are resources

We generally call context when we need to get information about different parts of our application like Activities, Applications etc.

Some operations(things where assistant is needed) where context is involved:

Loading common resources Creating dynamic views Displaying Toast messages Launching Activities etc. Different ways of getting context:

getContext()

getBaseContext()

getApplicationContext()

this

26