Що таке «контекст» на android android-context, code q - a російська (ru)

Як випливає з назви, це контекст поточного стану програми / об'єкта. Це дозволяє новоствореним об'єктам зрозуміти, що відбувається. Зазвичай ви викликаєте його, щоб отримати інформацію про іншу частину вашої програми (активність і пакет / додаток).

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

Типове використання контексту:

Створення нових об'єктів. створення нових уявлень, адаптерів, Прослуховувач:

Доступ до стандартних загальних ресурсів. Сервіси, такі як LAYOUT_INFLATER_SERVICE, SharedPreferences:

Доступ до компонентів неявно. щодо постачальників контенту, трансляцій, намірів

Визначення контексту.

  • Контекст представляє дані середовища
  • Він забезпечує доступ до таких речей, як бази даних

Спрощені умови.

Розглянемо, що Person-X є генеральним директором компанії-розробника програмного забезпечення.

У компанії присутня провідний архітектор, цей провідний архітектор робить всю роботу в компанії, яка включає в себе базу даних, призначений для користувача інтерфейс і т. Д.

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

Саме Архітектор розповідає про відповідальність недавно найнятого людини на основі навичок нової людини, незалежно від того, чи буде він працювати з базою даних або призначеним для користувача інтерфейсом і т. Д.

Спрощені умови.

Це схоже на доступ до активності Android до ресурсу додатка.

Це схоже на те, коли ви відвідуєте готель, ви хочете сніданок, обід і вечерю в підходящі терміни, чи не так?

Є багато інших речей, які вам подобаються під час перебування. Як ви отримуєте ці речі?

Ви просите людини, обслуговуючого номера, принести вам ці речі.

Тут людина, що обслуговує номера, є контекстом, вважаючи, що ви є єдиним заходом, і готель стане вашим додатком, і, нарешті, сніданок, обід і вечеря повинні бути ресурсами.

Речі, які пов'язані з контекстом:

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

Контекст - це базовий клас для Activity. Service. Application. і т.д.

Інший спосіб описати це: розглядати контекст як віддалене телебачення і канал на телебаченні - це ресурси, служби, використання намірів і т. Д. - - - Тут віддалений виступає як доступ, щоб отримати доступ до всіх різних ресурсів на передній план.

  • Таким чином, віддалений доступ до каналів, таким як ресурси, послуги, використання намірів і т. Д.
  • Аналогічно. Той, у кого є доступ до віддаленого, природно має доступ до всіх речей, таким як ресурси, послуги, використання намірів і т. Д.

Різні методи виклику, за допомогою яких ви можете отримати контекст

  • getApplicationContext ()
  • getContext ()
  • getBaseContext ()
  • Або this (коли в класі активності)

this -> відноситься до контексту поточної активності.

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

Ну, сама документація дає досить просте пояснення: клас 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. Найбільш очевидним класом є Клас Activity Activity успадковує від ContextThemeWrapper, який успадковується від ContextWrapper, який успадковується від самого контексту. Ці класи корисні для розуміння речей на більш глибокому рівні, але на даний момент досить знати, що ContextThemeWrapper і ContextWrapper - це в значній мірі те, що вони Вони реалізують абстрактні елементи самого класу Context шляхом «обгортання» контексту (фактичного контексту) і делегування цих функцій в цей контекст. Приклад корисний - в класі ContextWrapper абстрактний метод «getAssets» з Клас контексту реалізується в такий спосіб:

MBase - це просто поле, задане конструктором в конкретному контексті. Таким чином, контекст загорнутий, і ContextWrapper делегує його реалізацію методу getAssets в цей контекст. Давайте повернемося до розгляду класу Activity, який в кінцевому підсумку успадковує від Context, щоб побачити, як все це працює.

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

Знову ж, корисно подивитися конкретні приклади. Ми всі знаємо, як почати діяльність. Якщо у вас є «контекст», з якого ви перебуваєте, ви починаєте дію, ви просто викликаєте startActivity (намір), де Intent описує контекст, з якого ви починаєте дію і активність, які ви хочете запустити. Це знайома startActivity (це, SomeOtherActivity.class).

А що таке «це»? «This» - це ваша активність, тому що клас Activity успадковується від Context. Повний совок виглядає так: Коли ви викликаєте startActivity, в кінцевому підсумку клас Activity виконує щось на зразок цього:

Тому він використовує execStartActivity з класу Instrumentation (фактично з внутрішнього класу Instrumentation, званого ActivityResult).

На цьому етапі ми починаємо заглядати всередину системи.

Тут ОС фактично обробляє всі. Отже, як Instrumentation починає роботу точно? Ну, параметр «this» в методі execStartActivity вище - це ваша Activity, тобто Context, і execStartActivity використовує цей контекст.

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

Є деякі операції, які я не повністю вивчив, в яких проблеми з координатами і процесах. В кінцевому підсумку ActivityResult використовує власну операцію - ActivityManagerNative.getDefault (). StartActivity (), яка використовує Контекст, який ви передали, коли ви викликали startActivity. Контекст, в якому ви проходили, використовується, щоб допомогти в «вирішенні наміри», якщо це необхідно. Дозвіл наміри - це процес, за допомогою якого система може визначити мету наміри, якщо не вказано. (Зверніться до керівництва для отримання більш докладної інформації).

Останнє слово: чомусь люди, не обізнані з Android (і навіть люди, не такі нові), зовсім забувають про об'єктно-орієнтованому програмуванні, коли справа доходить до Android. З якоїсь причини люди намагаються звести свій розвиток Android до заздалегідь продуманим парадигм або вивченим поведінкою.

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

Ви тільки «маєте» контекст всередині своєї діяльності, тому що ваша діяльність сама успадковується з контексту. Там немає чарівництва (за винятком всього, що ОС робить сама по собі, щоб встановити різні параметри і правильно «налаштувати» ваш контекст). Таким чином, усунення проблем з пам'яттю / продуктивністю (наприклад, збереження посилань на контекст, коли вам це не потрібно або щось робити так, що має негативні наслідки для пам'яті і т. Д), Контекст - це об'єкт, як будь-який інший , і його можна передавати Як і будь-який POJO (звичайний Java-об'єкт). Іноді вам може знадобитися робити розумні речі для вилучення цього контексту, але будь-який звичайний Java-клас, який простягається від нічого, крім самого об'єкта, може бути написаний таким чином, який має доступ до контексту; Просто виставляйте публічний метод, який приймає контекст, а потім використовує його в цьому класі в міру необхідності. Це не призначалося для вичерпного звернення до внутрішніх компонентів контексту або Android, але я сподіваюся, що це буде корисно в демистификации контексту.

Контекст - це дескриптор системи; Він надає такі послуги, як дозвіл ресурсів, отримання доступу до баз даних і перевагам і т. Д. Додаток Android має дії. Це схоже на дескриптор середовища, в якій виконується вашу програму. Об'єкт Activity успадковує об'єкт Context.