Програмування під Android/Структура Android програми
Android додатки пишуться на Java. В Android інструменти SDK компілюють всі коди програми з будь-якими даними та ресурсами в файли APK: Android-пакет, який є архівним файлом з .apk суфіксом. Один АПК файл містить весь Android додаток і файл для декларацій пристроїв, які потребує програма.
Після встановлення на пристрої, кожен додаток є у своєму власному ізольованою програмному середовищі безпеки:
- Операційна система Android є багатокористувацькою системою Linux, в якій кожен додаток є іншим користувачем.
- За замовчуванням система привласнює кожному додатку ID(унікальний ідентифікатор) користувача Linux (ID використовується тільки системою та не видимий для додатку). Система встановлює права доступу для всіх файлів, так що тільки даний ідентифікатор, наданий додатку може отримати до них доступ.
- Кожен процес має свою віртуальну машину та є ізольованим від інших програм. За замовчуванням кожний додаток запускається у своєму процесі Linux.
- Android запускає процес, коли будь-який з компонентів додатку, необхідний для виконання, має бути запущений. Потім знищує процес, якщо він більше не потрібен, чи то коли система повинна відновити пам'ять для інших додатків.
Android система реалізує принципи найменших привілеїв. Тобто, кожен додаток, за замовчуванням, має доступ тільки до компонентів, які він вимагає, але не більше того. Це створює дуже безпечне середовище, в якій додаток не може отримати доступ до частини системи, до якої не дозволено торкатись.
Є шляхи для обміну даними з іншими додатками і для доступу до системних послуг:
- Існує можливість налаштувати так, що два додатки матимуть однаковий Linux Id, щоб вони були в змозі отримати доступ до файлів один одного. Щоб заощадити системні ресурси, додатки з одним і тим же ідентифікатором можуть запускатись в одному процесі й ділити між собою одну й ту ж віртуальну машину (англ. Virtial Machine, VM).
- Додаток може запитати дозволу на доступ до персональних даних пристрою, таких як контакти користувача, SMS повідомлень, розділ монтування (SD карту), камеру, Bluetooth і багато іншого. Всі дозволи програмі мають бути надані користувачем під час встановлення.
Це основи існування Android програми в системі. Інша частина цього документа знайомить вас з:
- Базовими компонентами, які визначають вашу програму.
- Файл маніфесту, в якому ви вказуєте компоненти й необхідні функції пристрою для вашої програми.
- Ресурси, які відокремлені від коду програми і дозволяють вашому додатку коректно оптимізувати свою поведінку для різних конфігурацій пристроїв.
Компоненти програми
[ред.]Компоненти додатку є основними блоками Android програми. Кожна компонента є іншою точкою, через яку система може виконувати вашу програму. Не всі компоненти є фактичними точками входу для користувача, а деякі навіть залежать один від одного, але кожен з них існує в якості власного вікна і відіграє особливу роль - кожен з них є унікальним будівельним блоком, який допомагає визначити загальну поведінку вашої програми.
Є чотири різних типи компонентів програми. Кожен тип слугує задля визначеної мети і має яскраво виражений життєвий цикл, який визначає, як компонент створюється й завершується.
Є чотири типи компонентів додатків:
Activity
[ред.]Activity(діяльність) являє собою один екран з призначеним для користувача інтерфейсом. Наприклад, електронна пошта може мати один вид Activity , який показує список нових повідомлень електронної пошти, іншу Activity , щоб скласти лист, та іншу Activity для читання електронної пошти. Хоча Activity працюють разом, формуючи цілісний користувацький інтерфейс в поштовому додатку, кожен з них працює незалежно від інших. Таким чином, інша програма може почати будь-який з цих видів Activity. Наприклад, додаток камери може почати свою діяльність в поштовому додатку, що складає нову пошту, для того, щоб поділитися зображенням.
Діяльність реалізована як підклас Activity.
Служби (Services)
[ред.]Служба являє собою компонент, який працює у фоновому режимі, щоб виконати тривалі операції або роботи для віддалених процесів. Служби не забезпечують користувацький інтерфейс. Наприклад, служба може відтворювати музику у фоновому режимі, поки користувач знаходиться в іншому додатку, або він може отримати дані по мережі, не блокуючи взаємодію користувача з активністю. Ще один компонент, наприклад, Activity, може запустити службу і працювати в звязці.
Сервіс реалізований як підклас служби, і ви можете дізнатися більше про це в керівництві Послуги розробників.
Контент-провайдери (Content providers)
[ред.]Контент-провайдер управляє загальним набором даних додатку. Ви можете зберігати дані у файловій системі, базі даних SQLite, в Інтернеті, або будь-якому місці, до якого додаток може отримати доступ. Через контент-провайдер, інші додатки можуть запитувати або навіть змінювати дані (якщо контент-провайдер це дозволяє). Наприклад, Android система забезпечує контент-провайдер, який управляє інформацією про контакти користувача. Таким чином, будь-яка програма з відповідними правами може запитувати частину контент-провайдера (наприклад, ContactsContract.Data) читати і писати інформацію про конкретну людину.
Контент-провайдери також корисні для читання і запису даних, яка є приватною для вашої програми, а не розділяє. Наприклад, додаток Примітка зразок Pad використовує постачальника контенту для збереження запису.
Контент-провайдер реалізований як підклас ContentProvider і повинен реалізувати стандартні API-інтерфейси, які дозволяють іншим програмам виконувати транзакції.
Broadcast receivers
[ред.]Широкомовний приймач це компонент, який відповідає за загальносистемні широкомовні анонси. Багато трансляцій відбуваються з системи, наприклад, оголошення, що екран вимкнувся, батарея розряджена. Додатки можуть також ініціювати трансляції, наприклад, щоб інші програми знали про дані, які були завантажені в пристрій для використання. Хоча широкомовні приймачі не відображають для користувача інтерфейс, вони можуть створити повідомлення, щоб попередити користувача, коли відбувається широкомовна подія. Однак, найчастіше, широкомовний приймач є просто "шлюзом" для інших компонентів і має за мету виконати мінімум роботи. Наприклад, ініціювати послугу для виконання частини роботи, на основі події. Широкомовний приймач виконаний у вигляді підкласу BroadcastReceiver, і кожен широкомовний приймач являє собою доручення у вигляді Intent-у.
Унікальною особливістю архітектури Android є те, що будь-яка програма може почати компонент іншої програми. Наприклад, якщо ви хочете, щоб користувач знімав за допомогою камери, має бути інший додаток, що дозволяє це. Тоді ваш додаток може використовувати його, щоб зробити знімок, замість того щоб "винаходити велосипед". Вам не потрібно включати або навіть посилатись у вихідному коді на додаток камери. Замість цього, ви можете просто почати свою діяльність у актівіті камери, яка захоплює фото. Після завершення фото можна навіть повернутись у ваш додаток, щоб ви могли використовувати результат(в даному випадку знімок). Для користувача, здається, ніби камера є частиною вашої програми.
Коли система запускає компонент, починається процес для цього додатка (якщо він ще не запущений) і створює екземпляри класів, необхідних для компонента. Наприклад, якщо ваш додаток починає свою діяльність в додатоку камери, яка захоплює фото, то діяльність виконується в процесі, котрому належить додаток камери, а не в процесі вашої програми. Тому, на відміну від програм у інших операційних системах, програми Android не мають єдиної точки входу (наприклад немає основої функції).
Оскільки система виконує кожен додаток в окремому процесі з правами доступу до файлів, які обмежують доступ до інших додатків, ваш додаток не може безпосередньо активувати компонент з іншої програми. Але це може система Android. Так, щоб активувати компонент в іншому додатку, необхідно надіслати повідомлення до системи, яка визначає свій намір стартувати деякий компонент. Потім система активує компонент для вас.
Файл маніфесту
[ред.]Перед тим як Android-система зможе почати компонент програми, система повинна знати, що даний компонент існує, прочитавши файл AndroidManifest.xml (файл "маніфесту"). Ваш додаток повинен оголосити всі його компоненти в цьому файлі, що повинні бути в кореневому каталозі проекту.
Маніфест робить кілька речей в додаток до декларування компонентів програми:
- Виявлення будь-яких дозволів користувача, які вимагає додаток, наприклад, доступ в Інтернет або читання контактів користувача.
- Оголошує мінімальний рівень API, необхідний для програми, на основі API, що використовуються програмою.
- Оголосити апаратні і програмні можливості, що використовуються або необхідні додатки, такі як камера, Bluetooth, або можливість мультитачу.
- Використати API бібліотеки, з якими має бути пов'язаний додаток, напр. бібліотека Google Maps.
- Та ін.
Оголошення компоненту
[ред.]Оголошення можливостей компоненту
[ред.]Оголошення потреб додатку
[ред.]Ресурси програми
[ред.]Android-додаток складається з більш, ніж просто коду - це вимагає ресурсів, які відокремлені від вихідного коду, такі як зображення, аудіофайли, і все, що відноситься до візуального сприйняття програми. Наприклад, ви повинні визначити анімацію, меню, стилі, кольори і розташування інтерфейсів актівіті для користувача з XML файлів. Використання ресурсів програми дозволяє легко оновлювати різні характеристики вашого додатку без модифікації коду і, надаючи набори альтернативних ресурсів, дозволяє оптимізувати ваш додаток для різних конфігурацій пристроїв (таких, як різні мови і розміри екрану).
Для кожного ресурсу, який ви включаєте в ваш проект, SDK визначає унікальний цілочисельний ідентифікатор, який можна використовувати для посилання на ресурс в коді програми або з інших джерел, визначених у XML. Наприклад, якщо ваш додаток містить файл зображення з ім'ям logo.png (зберігаються в RES res/drawable/ ), то SDK генерують ID ресурсу з ім'ям R.drawable.logo, який можна використовувати в певному інтерфейсі в якості посилання на зображення.
Одним з найбільш важливих аспектів забезпечення ресурсів окремо від вихідного коду є можливість забезпечити певний набір альтернативних ресурсів для використання їх для різних конфігурацій пристроїв. Наприклад, шляхом визначення рядка користувача інтерфейсу в XML, ви можете перекладати рядки на інші мови і зберегти ці рядки в окремих файлах. Потім, грунтуючись на вашому виборі, котрий ви додати до імені Каталогу ресурсів (такі, як RES / значень-FR / для французьких строкових значень) і мови користувача, Android система застосовує відповідні рядки мови для користувача інтерфейсу.
Android підтримує безліч різних наборів для ваших альтернативних ресурсів. Класифікатор є короткий рядок, що ви включили в ім'я ваших каталогів ресурсів, щоб визначити конфігурацію пристрою, для якого ці ресурси повинні бути використані. В якості іншого прикладу, ви повинні часто створювати різні макети для вашої актівіті, залежно від орієнтації екрану пристрою і розміру. Наприклад, коли на екрані пристрою в портретній орієнтації, ви напевне захочете мати кнопки також з вертикальною орієнтацією, а коли екран в альбомній орієнтації, кнопки повинні бути вирівняні по горизонталі. Щоб змінити макет залежно від орієнтації, можна визначити дві різні схеми і застосувати відповідний класифікатор для ім'я каталогу кожного макету. Потім система автоматично застосує відповідний макет залежно від поточної орієнтації пристрою.
Більш детальну інформацію про різні види ресурсів і як створити альтернативні ресурси для різних конфігурацій пристроїв, читати Керування ресурсами.