SlideShare uma empresa Scribd logo
1 de 31
Android open sourcedeveloper-friendly mobile operational system
Содержание Общее впечатление от Android Пример архитектуры приложения (I часть) 2 Android first mini party
Общее впечатление от Android Наше самое субъективное мнение
Что знает каждый Открытость системы (≈4GB of sources) По-настоящему большое число устройств Новая версия ОС каждые полгода-год Легкость разработки, хорошая документация Java Android market Уникальная модель многозадачности Эксклюзивные плюшки от Google 4 Android first mini party
Что в действительности (1/3) Производители Они любят копаться в коде Они точно знают, как сделать лучше Их интересуют деньги, а не платформа и это нормально  Google им попустительствует и это не нормально Много девайсов Вам правда потребуется много девайсов Аппаратные функции телефона тестируются на устройствах screenresolution, CPU, hardwarekeyboard, etc. 5 Android first mini party
Что в действительности (2/3) Новая версия ОС каждые полгода-год Новая ОС — новый девайс Support придумали дураки Backwardcompatibility Открытость Вседозволенность разработчиков Безумные идеи заказчиков Претензии начальников Нерадивые производители Java Тормозит? Аппараты от 1GHz Никогда не поздно вспомнить JNI и C/C++ 6 Android first mini party
Что в действительности (3/3) Прочие подводные камни Это мультизадачность, сынок, готовься к смерти Как передать данные от Activity к Activity? А какой же здесь Context? (Смена ориентации) I WANT TO SEARCH! RIGHT NOW! Activity lifecycle SD-Card mount/unmount MediaAPI (я никогда не устану это повторять:) 7 Android first mini party
Примеры Один 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
Так за что же тогда его любить? За его молодость За работу над ошибками (3.0 мммм:) За открытые исходные коды За его ориентированность на разработчиков За бесконечные возможности 9 Android first mini party
Пример архитектуры приложения Частные решения частых задач
Задание Есть сервер, с которого мы получаем данные (tweets). Мы отображаем эти данные (listoftweets) Мы редактируем старые/создаем новые данные и отсылаем на сервер (reply/delete/new) Мы периодически синхронизируем данные с сервером Мы храним данные локально, чтобы приложение могло быть запущено без интернета Мы предоставляем настройку периодов синхронизации и какие-то другие параметры 11 Android first mini party
Общее представление Server Application DB Login Activity Preferences Activity Edit Activity Main Activity 12 Android first mini party
А для приготовления нам понадобятся… 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
Android-команда Люси Джефф Борис 14 Android first mini party
Первая итерация  Получение списка записей пока при старте приложения пока для hardcoded пользователя Сохранение записейв базу Отображение записей на экране 15 Android first mini party
Над чем не стоит долго думать HttpClient, а не java.net.URL SQLite&SQLiteOpenHelper ListView&ListActivity 16 Android first mini party
ListView 17 layout.xml List Adapter + getItem(); + getCount(); + getView(); + getItemViewType(); + getViewTypeCount(); Android first mini party
Спор Люси и БорисаСобственный Store DomainObject ArrayAdapter Самостоятельно реализовыватьObservers А как по другому? Там что-то непонятное написано 18 Android first mini party
Спор Люси и БорисаContentProvider Contract&CursorAdapter Observers – DONE и очень даже крутой Activity.manageCursor()  помощь при с открытием и закрытие Cursor ContentProvider .openFile () полезный метод для работы с binary data 19 Android first mini party
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
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)
Вторая итерация Логин на отдельной LoginActivity и переход на MainActivity Переход на EditActivityдля выбранной записи 22 Android first mini party
Передача данных между Activity Исследование Джеффа 23 Android first mini party
Service. Что же это такое? Компонент приложения, скрытый от пользователя Нацелен на выполнения фоновых задач Работает в главном потоке Его можно стартить К нему можно биндиться Его НУЖНО стопить Его ОБЯЗАТЕЛЬНО нужно стопить Процесс, в котором есть застарченный Service,будет умирать в последнюю очередь 24 Android first mini party
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
Service. Lifecycle 26 Android first mini party
Проблема Бориса Android first mini party 27 Thread Looper
Решение Люси Android first mini party 28 Handler post(Runnable r) handleMessage(Message m) obtainMessage() sendMessage()
Решение Джеффа Android first mini party 29  private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {     protected Long doInBackground(URL... urls) {         int count = urls.length;         long totalSize = 0;         for (int i = 0; i < count; i++) {             totalSize += Downloader.downloadFile(urls[i]);             publishProgress((int) ((i / (float) count) * 100));         }         return totalSize;     }     protected void onProgressUpdate(Integer... progress) {         setProgressPercent(progress[0]);     }     protected void onPostExecute(Long result) {         showDialog("Downloaded " + result + " bytes");     } }
GOOGLE I/O 2010 30 Android first mini party
Решение задачи передачи данных Никакой проблемы передача данных между Activityна самом деле не существует Activity – это взгляд с разных сторон на данные, которые находятся в Content Provider Service – это task executor (см. IntentService) Intent – это такс на выполнение, содержащий Action и URI  ServiceContract/API – API для взаимодействия ссервисом Service State – singleton для опционального хранения состояния Service Binder нужен только для частных синхронных операций 31 Android first mini party

Mais conteúdo relacionado

Destaque

How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
ThinkNow
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
Kurio // The Social Media Age(ncy)
 

Destaque (20)

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPT
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 

First Android Mini-party (Part I)

  • 1. Android open sourcedeveloper-friendly mobile operational system
  • 2. Содержание Общее впечатление от Android Пример архитектуры приложения (I часть) 2 Android first mini party
  • 3. Общее впечатление от Android Наше самое субъективное мнение
  • 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
  • 10. Пример архитектуры приложения Частные решения частых задач
  • 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
  • 14. Android-команда Люси Джефф Борис 14 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
  • 23. Передача данных между Activity Исследование Джеффа 23 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
  • 26. Service. Lifecycle 26 Android first mini party
  • 27. Проблема Бориса Android first mini party 27 Thread Looper
  • 28. Решение Люси Android first mini party 28 Handler post(Runnable r) handleMessage(Message m) obtainMessage() sendMessage()
  • 29. Решение Джеффа Android first mini party 29  private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {     protected Long doInBackground(URL... urls) {         int count = urls.length;         long totalSize = 0;         for (int i = 0; i < count; i++) {             totalSize += Downloader.downloadFile(urls[i]);             publishProgress((int) ((i / (float) count) * 100));         }         return totalSize;     }     protected void onProgressUpdate(Integer... progress) {         setProgressPercent(progress[0]);     }     protected void onPostExecute(Long result) {         showDialog("Downloaded " + result + " bytes");     } }
  • 30. GOOGLE I/O 2010 30 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