4. Что знает каждый Открытость системы (≈4GB of sources) По-настоящему большое число устройств Новая версия ОС каждые полгода-год Легкость разработки, хорошая документация Java Android market Уникальная модель многозадачности Эксклюзивные плюшки от Google 4 Android first mini party
5. Что в действительности (1/3) Производители Они любят копаться в коде Они точно знают, как сделать лучше Их интересуют деньги, а не платформа и это нормально Google им попустительствует и это не нормально Много девайсов Вам правда потребуется много девайсов Аппаратные функции телефона тестируются на устройствах screenresolution, CPU, hardwarekeyboard, etc. 5 Android first mini party
6. Что в действительности (2/3) Новая версия ОС каждые полгода-год Новая ОС — новый девайс Support придумали дураки Backwardcompatibility Открытость Вседозволенность разработчиков Безумные идеи заказчиков Претензии начальников Нерадивые производители Java Тормозит? Аппараты от 1GHz Никогда не поздно вспомнить JNI и C/C++ 6 Android first mini party
7. Что в действительности (3/3) Прочие подводные камни Это мультизадачность, сынок, готовься к смерти Как передать данные от Activity к Activity? А какой же здесь Context? (Смена ориентации) I WANT TO SEARCH! RIGHT NOW! Activity lifecycle SD-Card mount/unmount MediaAPI (я никогда не устану это повторять:) 7 Android first mini party
8. Примеры Один INSERT в Sqliteна Galaxy S занимает около секунды - что-то не получилось с файловой системой MediaRecorder.start() с выводом в AMR_NB на DROID X или зависал на стопе или искажал звук MediaRecorder.stop() на Motorola Milestone после 10 минут не хотел выполняться MediaRecorder.init() на Motorola Milestone с неправильными параметрами убивал камеру до следующего перезапуска MediaRecorder.setMaxDuration() — who gives a shit? Camera.getParameters() — HashMap<String, String> Падают стандартные приложения и многое-многое другое… 8 Android first mini party
9. Так за что же тогда его любить? За его молодость За работу над ошибками (3.0 мммм:) За открытые исходные коды За его ориентированность на разработчиков За бесконечные возможности 9 Android first mini party
11. Задание Есть сервер, с которого мы получаем данные (tweets). Мы отображаем эти данные (listoftweets) Мы редактируем старые/создаем новые данные и отсылаем на сервер (reply/delete/new) Мы периодически синхронизируем данные с сервером Мы храним данные локально, чтобы приложение могло быть запущено без интернета Мы предоставляем настройку периодов синхронизации и какие-то другие параметры 11 Android first mini party
12. Общее представление Server Application DB Login Activity Preferences Activity Edit Activity Main Activity 12 Android first mini party
13. А для приготовления нам понадобятся… Android-sdk-tools скачать как минимум версию 2.1 и Google APIs android-ndk-tools (для ценителей C/C++) Eclipse/Idea можно подключить android formatter для кода ADT plugin (Eclipse) Android Java sources ApiDemosв workspace 13 Android first mini party
15. Первая итерация Получение списка записей пока при старте приложения пока для hardcoded пользователя Сохранение записейв базу Отображение записей на экране 15 Android first mini party
16. Над чем не стоит долго думать HttpClient, а не java.net.URL SQLite&SQLiteOpenHelper ListView&ListActivity 16 Android first mini party
17. ListView 17 layout.xml List Adapter + getItem(); + getCount(); + getView(); + getItemViewType(); + getViewTypeCount(); Android first mini party
18. Спор Люси и БорисаСобственный Store DomainObject ArrayAdapter Самостоятельно реализовыватьObservers А как по другому? Там что-то непонятное написано 18 Android first mini party
19. Спор Люси и БорисаContentProvider Contract&CursorAdapter Observers – DONE и очень даже крутой Activity.manageCursor() помощь при с открытием и закрытие Cursor ContentProvider .openFile () полезный метод для работы с binary data 19 Android first mini party
20. ContentProvider. Contract public final class ContentContract { public static final String AUTHORITY = "x.test.content"; public static final Uri AUTHORITY_URI = Uri.parse("content://" + AUTHORITY); private ContentContract() { } protected interface QuestionsColumns { String GUID = "guid"; /** Active or closed */ String STATE = "state"; /** Rated, Read, Not read, Rejected */ String SUB_STATE = "substate"; String HAS_TRACK = "has_track"; String TRANSCRIPTION = "transcription"; String PRICE = "price"; String POST_DATE = "post_date"; } public static final class Questions implements QuestionsColumns, BaseColumns { private Questions() {} public static class State { intEDITED = 0, OPENED = 1, CLOSED = 2, DELETED = 3; } public static class Substate { intPENDING = 0, READY_TO_SEND = 1; } public static final Uri CONTENT_URI = Uri.withAppendedPath(AUTHORITY_URI, "questions"); public static final String CONTENT_TYPE = "vnd.android.cursor.dir/x.test.question"; public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/x.test.question"; } 20 Android first mini party
21. ContentProvider. URI Android first mini party 21 content:// questions content://questions/# content://questions/opened content://questions/closed content:// questions/#/answerscontent:// questions/#/attachments ContentProvider.notifyChange(uri)ContentResolver.registerContentObserver(uri, true, observer)
22. Вторая итерация Логин на отдельной LoginActivity и переход на MainActivity Переход на EditActivityдля выбранной записи 22 Android first mini party
24. Service. Что же это такое? Компонент приложения, скрытый от пользователя Нацелен на выполнения фоновых задач Работает в главном потоке Его можно стартить К нему можно биндиться Его НУЖНО стопить Его ОБЯЗАТЕЛЬНО нужно стопить Процесс, в котором есть застарченный Service,будет умирать в последнюю очередь 24 Android first mini party
25. Service. Local binder public class LocalService extends Service { private final IBindermBinder = new LocalBinder(); private final Random mGenerator = new Random(); public class LocalBinder extends Binder { LocalServicegetService() { return LocalService.this; } } @Override public IBinderonBind(Intent intent) { return mBinder; } public intgetRandomNumber() { return mGenerator.nextInt(100); }} 25 Android first mini party
31. Решение задачи передачи данных Никакой проблемы передача данных между Activityна самом деле не существует Activity – это взгляд с разных сторон на данные, которые находятся в Content Provider Service – это task executor (см. IntentService) Intent – это такс на выполнение, содержащий Action и URI ServiceContract/API – API для взаимодействия ссервисом Service State – singleton для опционального хранения состояния Service Binder нужен только для частных синхронных операций 31 Android first mini party