4. Android Application
• Програми взаємодіють між
собою, формують одне середовище
• Відсутність однієї точки входу
int main() {
printf(“Hello World”);
}
5. Стандартна система з плагінами
Стандартна схема організації плагінів
http://en.wikipedia.org/wiki/Plug-in_(computing)
11. Активності та задачі
Купівля Поділитися
Інформація про ап Повний текст
Пошук Список новин
Почитати новини
Пропозиції на
головній сторінці
Встановити новий ап
Читаємо http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html
12. Активності та задачі
Купівля Поділитися
Інформація про ап Повний текст
Пошук Список новин
Почитати новини
Пропозиції на
головній сторінці
Встановити новий ап
Активність
Читаємо http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html
15. Активність - GUI
setContentView(view)
LinearLayout TextView
TextView
Image
TextView RelativeLayout
View TextView
RelativeLayout
… TextView
Image
ImageView TextView TextView View TextView
Дерево може бути описане за допомогою XML
16. Ресурси
• Графіка (drawable)
• Тексти (string)
• Стилі (style)
• Розмітка (layout)
• та ще дуже багато
(dimen, color, string-array, …)
Читаємо http://developer.android.com/guide/topics/resources/index.html
17. Конфігурація
• Орієнтація екрану
• Локаль
• Оператор
• Розмір екрану
• Густина пікселів
• …
18. Життєвий цикл активності
• Пам’ятаємо про:
– активність має стан, який змінюється під час
роботи користувача з нею
– активність може бути знищена за ініціативи
системи
– при цьому потрібно зберегти стан
– View вміють зберігати свій стан
• Найбанальніший приклад знищення
активності: переворот екрану (зміна
конфігурації).
19. Фрагменти
• Великий екран – великі зміни
• Основний великий будівельний блок
вашого апа
• Ще цікавіший життєвий цикл
• Взаємодію між фрагментами слід
здійснюватися через активність
20. Фрагменти
Активність з
одним A B
фрагментом
Список Детальна
елементів інформація
Телефон
24. Активація компонентів
• Intent
– data URI, type дані, над якими працюємо
– action дія, яку потрібно виконати
– extras додаткові параметри (ключ - значення)
• Набрати номер:
data = „tel:+38093XXXXXXX‟
action = Intent.ACTION_VIEW
або Intent.ACTION_CALL (вимагає окремого дозволу)
• Перейти до карти
data = „geo:49.91667,36.31667?z=12‟
action = Intent.ACTION_VIEW
• Відправити листа, твіт, пост у фейсбук:
Intent.ACTION_SEND + extras
25. Маніфест
• Основна функція: описати власні
компоненти та вказати, як вони можуть
активуватися ззовні
• Вказує вимоги вашого апа до апаратури та
версії Android
• Перелічує дозволи, які користувач повинен
буде надати апу
26. Підміняємо сайт на свій додаток
<activity android:name=".activity.BrowserInterceptorActivity”>
<intent-filter>
<!– Фільтр для Intent.action -->
<action android:name="android.intent.action.VIEW" />
<!– Фільтр для Intent.category -->
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!– Фільтр для Intent.data (URI) -->
<data
android:scheme="http"
android:host=”example.com"
android:pathPattern="/profile/.*"
/>
</intent-filter>
</activity>
28. Сервіси
• Не пов’язані з UI напряму
• Фонові задачі: програвання
музики, завантаження даних
• Як правило, взаємодію з API якогось
сервера бажано реалізовувати через сервіс
• Простіший життєвий цикл (суб’єктивно!)
• Два типи: з підв’язкою, виконання команд
30. Контент-провайдери query
insert
• Надають доступ до вашого update
набору даних delete
content://my.content.authority/place/345
authority, визначається в маніфесті
• Інші компоненти працюють з ними через
ContentResolver
• Приклад стандартного провайдера:
контакти
32. Broadcast Receiver
• Зміна часового поясу
• Завантаження системи
• Вимкнення телефону
Для того, щоб зробити розумні сервіси:
• Зміна стану заряду батареї
• Підключення «зарядки»
34. Головний потік та асинхронні задачі
• Виклики методів життєвого циклу завжди
виконуються в основному потоці (слідкуйте
за ANR!)
• AsyncTask – винесення операції в окремий
потік
• AsyncQueryHandler – запити до контент
провайдера в окремому потоці
• Все це працює через Handler
35. Користуйтеся StrictMode!
StrictMode.setThreadPolicy(
new StrictMode.ThreadPolicy.Builder()
.detectAll()
.penaltyLog()
.build()
);
StrictMode.setVmPolicy(
new StrictMode.VmPolicy.Builder()
.detectAll()
.penaltyLog()
.build()
);