Что знает каждыйОткрытостьсистемы (≈4GB of sources)По-настоящему большое число устройствНовая версия ОС каждые полгода-годЛегкость разработки, хорошая документацияJavaAndroid marketУникальная модель многозадачностиЭксклюзивные плюшки от Google4Android first mini party
5.
Что в действительности(1/3)ПроизводителиОни любят копаться в кодеОни точно знают, как сделать лучшеИх интересуют деньги, а не платформа и это нормально Google им попустительствует и это не нормальноМного девайсовВам правда потребуется много девайсовАппаратные функции телефона тестируются на устройствахscreenresolution, CPU, hardwarekeyboard, etc.5Android first mini party
6.
Что в действительности(2/3)Новая версия ОС каждые полгода-годНовая ОС — новый девайсSupport придумали дуракиBackwardcompatibilityОткрытостьВседозволенность разработчиковБезумные идеи заказчиковПретензии начальниковНерадивые производителиJavaТормозит?Аппараты от 1GHzНикогда не поздно вспомнить JNI и C/C++6Android first mini party
7.
Что в действительности(3/3)Прочие подводные камниЭто мультизадачность, сынок, готовься к смертиКак передать данные от Activity к Activity?А какой же здесь Context? (Смена ориентации)I WANT TO SEARCH! RIGHT NOW!Activity lifecycleSD-Card mount/unmountMediaAPI (я никогда не устану это повторять:)7Android 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>Падают стандартные приложения и многое-многое другое…8Android first mini party
9.
Так за чтоже тогда его любить?За его молодостьЗа работу над ошибками (3.0 мммм:)За открытые исходные кодыЗа его ориентированность на разработчиковЗа бесконечные возможности9Android first mini party
ЗаданиеЕсть сервер, скоторого мы получаем данные (tweets).Мы отображаем эти данные (listoftweets)Мы редактируем старые/создаем новые данные и отсылаем на сервер (reply/delete/new)Мы периодически синхронизируем данные с серверомМы храним данные локально, чтобы приложение могло быть запущено без интернетаМы предоставляем настройку периодов синхронизации и какие-то другие параметры11Android first mini party
А для приготовлениянам понадобятся…Android-sdk-toolsскачать как минимум версию 2.1 и Google APIsandroid-ndk-tools (для ценителей C/C++)Eclipse/Ideaможно подключить android formatter для кода ADT plugin (Eclipse)Android Java sourcesApiDemosв workspace13Android first mini party
Первая итерация Получениесписка записейпока при старте приложенияпока для hardcoded пользователяСохранение записейв базуОтображение записей на экране15Android first mini party
16.
Над чем нестоит долго думатьHttpClient, а не java.net.URLSQLite&SQLiteOpenHelperListView&ListActivity16Android first mini party
Спор Люси иБорисаСобственный StoreDomainObjectArrayAdapterСамостоятельно реализовыватьObserversА как по другому?Там что-то непонятное написано18Android first mini party
19.
Спор Люси иБорисаContentProviderContract&CursorAdapterObservers – DONEи очень даже крутойActivity.manageCursor() помощь при с открытием и закрытие CursorContentProvider .openFile ()полезный метод для работы с binary data19Android first mini party
20.
ContentProvider. Contractpublic finalclass 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";}20Android first mini party
Service. Что жеэто такое?Компонент приложения, скрытый от пользователяНацелен на выполнения фоновых задачРаботает в главном потокеЕго можно стартитьК нему можно биндитьсяЕго НУЖНО стопитьЕго ОБЯЗАТЕЛЬНО нужно стопитьПроцесс, в котором есть застарченный Service,будет умирать в последнюю очередь24Android first mini party
25.
Service. Local binderpublicclass 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); }}25Android first mini party
Решение задачи передачиданныхНикакой проблемы передача данных между Activityна самом деле не существуетActivity – это взгляд с разных сторон на данные, которые находятся в Content ProviderService – это task executor (см. IntentService)Intent – это такс на выполнение, содержащий Action и URI ServiceContract/API – API для взаимодействия ссервисомService State – singleton для опционального хранения состояния ServiceBinder нужен только для частных синхронных операций31Android first mini party