Розробка під Android. Роман Мазур

1,520 views
1,466 views

Published on

Мастер- класс по Android разработке. Чернигов. Февраль

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,520
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • 5хв
  • 5хв
  • 5хв
  • 5хв
  • 5хв
  • 5хв
  • 5хв
  • 5хв
  • 5хв
  • 5хв
  • 5хв
  • 5хв
  • 5хв
  • 5хв
  • 5хв
  • 5хв
  • 5хв
  • 5хв
  • 5хв
  • 5хв
  • Проблеми, недоліки?
  • Правила запуску, що відбувається
  • Правила запуску, що відбувається
  • Правила запуску, що відбувається
  • 5хв
  • 5хв
  • 5хв
  • 5хв
  • Приклади апів
  • 5хв
  • 5хв
  • 5хв
  • 5хв
  • 5хв
  • 5хв
  • Розробка під Android. Роман Мазур

    1. 1. Розробка під Android нюанси...
    2. 2. Продовжуємо <ul><ul><li>Безпека </li></ul></ul><ul><ul><li>Дані користувача </li></ul></ul><ul><ul><li>Ідентифікація користувача </li></ul></ul><ul><ul><li>Основний (GUI) потік </li></ul></ul><ul><ul><li>Асинхронний доступ до даних </li></ul></ul><ul><ul><li>Організація роботи з віддаленим сервером </li></ul></ul><ul><ul><li>Відлагодження та оптимізація </li></ul></ul>
    3. 3. Продовжуємо <ul><ul><li>Безпека </li></ul></ul><ul><ul><li>Дані користувача </li></ul></ul><ul><ul><li>Ідентифікація користувача </li></ul></ul><ul><ul><li>Основний (GUI) потік </li></ul></ul><ul><ul><li>Асинхронний доступ до даних </li></ul></ul><ul><ul><li>Організація роботи з віддаленим сервером </li></ul></ul><ul><ul><li>Відлагодження та оптимізація </li></ul></ul>
    4. 4. Безпека <ul><ul><li>Система відкрита, але кожен з додатків має свою пісочницю </li></ul></ul><ul><ul><li>За замовчуванням доступ до ваших ресурсів закритий </li></ul></ul><ul><ul><li>Можна оголосити права, якими повинен володіти той, хто виконує доступ до ваших ресурсів </li></ul></ul><ul><ul><li>Права не можна отримати динамічно </li></ul></ul><ul><ul><li>Розмежування відбувається на рівні ОС, тому не залежить від того, що ви використовуєте: NDK чи SDK </li></ul></ul>
    5. 5. Безпека <ul><ul><li>Додатки підписуються сертифікатами, сертифікати - &quot;самопідписні&quot; </li></ul></ul><ul><ul><li>Мета - ідентифікувати авторів додатків для введення поняття прав на рівні підписів </li></ul></ul><ul><ul><li>Кожен додаток має свого користувача, ті хто підписані одним сертифікатом можуть мати спільного користувача </li></ul></ul>
    6. 6. C2DM
    7. 7. C2DM Права: <!-- C2DM --> <uses-permission   android:name = &quot;com.google.android.c2dm.permission.RECEIVE&quot;   /> <!-- Only this application can receive the messages and registration result -->   <permission       android:name = &quot; my.application .permission.C2D_MESSAGE&quot;       android:protectionLevel = &quot;signature&quot;       /> <uses-permission   android:name = &quot; my.application .permission.C2D_MESSAGE&quot;   />   Реєстрація: Intent registrationIntent = new Intent ( &quot;com.google.android.c2dm.intent.REGISTER&quot; ); registrationIntent . putExtra ( &quot;app&quot; , PendingIntent . getBroadcast ( this , 0 , new Intent (), 0 )); registrationIntent . putExtra ( &quot;sender&quot; , emailOfSender ); startService ( registrationIntent );
    8. 8. C2DM <receiver         android:name = &quot;com.google.android.c2dm.C2DMBroadcastReceiver&quot;       android:permission = &quot;com.google.android.c2dm.permission.SEND&quot;       >        <intent-filter>          <action   android:name = &quot;com.google.android.c2dm.intent.RECEIVE&quot;   />          <category   android:name = &quot;my.application&quot;   />        </intent-filter>        <intent-filter>          <action   android:name = &quot;com.google.android.c2dm.intent.REGISTRATION&quot;   />          <category   android:name = &quot;my.application&quot;   />        </intent-filter> </receiver>  
    9. 9. Продовжуємо <ul><ul><li>Безпека </li></ul></ul><ul><ul><li>Дані користувача </li></ul></ul><ul><ul><li>Ідентифікація користувача </li></ul></ul><ul><ul><li>Основний (GUI) потік </li></ul></ul><ul><ul><li>Асинхронний доступ до даних </li></ul></ul><ul><ul><li>Організація роботи з віддаленим сервером </li></ul></ul><ul><ul><li>Відлагодження та оптимізація </li></ul></ul>
    10. 10. Дані користувача Де зберігати?
    11. 11. Дані користувача <ul><ul><li>SharedPreferences (ключ-значення, прості вибірки) </li></ul></ul><ul><ul><li>SQLite (для пошуку, складних зв'язків) </li></ul></ul><ul><ul><li>Файли </li></ul></ul><ul><ul><ul><li>пам'ять телефону </li></ul></ul></ul><ul><ul><ul><li>зовнішня пам'ять </li></ul></ul></ul>
    12. 12. Дані користувача BackupManager Телефони можуть змінюватися - налаштування мають залишитися
    13. 13. Продовжуємо <ul><ul><li>Безпека </li></ul></ul><ul><ul><li>Дані користувача </li></ul></ul><ul><ul><li>Ідентифікація користувача </li></ul></ul><ul><ul><li>Основний (GUI) потік </li></ul></ul><ul><ul><li>Асинхронний доступ до даних </li></ul></ul><ul><ul><li>Організація роботи з віддаленим сервером </li></ul></ul><ul><ul><li>Відлагодження та оптимізація </li></ul></ul>
    14. 14. Ідентифікація <ul><li>Насправді немає унікального ідентифікатору пристрою  </li></ul><ul><ul><li>TelephonyManager.getDeviceId() - IMEI, MEID, ESN </li></ul></ul><ul><ul><li>MAC-адреса </li></ul></ul><ul><ul><li>android.os.Build.SERIAL - з 2.3 </li></ul></ul><ul><ul><li>Settings.Secure.ANDROID_ID </li></ul></ul>
    15. 15. Ідентифікація <ul><ul><li>Ідентифікація інсталяції згенерувати та зберегти  </li></ul></ul><ul><li>UUID.randomUUID().toString() </li></ul><ul><li>SharedPreferences </li></ul>
    16. 16. Ідентифікація <ul><ul><li>Ідентифікація інсталяції згенерувати та зберегти  </li></ul></ul><ul><li>UUID.randomUUID().toString() </li></ul><ul><li>SharedPreferences </li></ul>+
    17. 17. Продовжуємо <ul><ul><li>Безпека </li></ul></ul><ul><ul><li>Дані користувача </li></ul></ul><ul><ul><li>Ідентифікація користувача </li></ul></ul><ul><ul><li>Основний (GUI) потік </li></ul></ul><ul><ul><li>Асинхронний доступ до даних </li></ul></ul><ul><ul><li>Організація роботи з віддаленим сервером </li></ul></ul><ul><ul><li>Відлагодження та оптимізація </li></ul></ul>
    18. 18. Основний (GUI) потік <ul><ul><li>Кожен потік має свій екземпляр Looper , який обробляє чергу повідомлень </li></ul></ul><ul><ul><li>Події від усіх компонентів передаються в Looper (наприклад, події в GUI – від View, поява Intent) </li></ul></ul>
    19. 19. Основний (GUI) потік
    20. 20. Основний (GUI) потік <ul><ul><li>Виклики методів життєвих циклів компонентів завжди проходять в основному потокові Будьте швидкими! </li></ul></ul><ul><ul><li>HandlerThread - потік з Looper </li></ul></ul>
    21. 21. Продовжуємо <ul><ul><li>Безпека </li></ul></ul><ul><ul><li>Дані користувача </li></ul></ul><ul><ul><li>Ідентифікація користувача </li></ul></ul><ul><ul><li>Основний (GUI) потік </li></ul></ul><ul><ul><li>Асинхронний доступ до даних </li></ul></ul><ul><ul><li>Організація роботи з віддаленим сервером </li></ul></ul><ul><ul><li>Відлагодження та оптимізація </li></ul></ul>
    22. 22. Асинхронний доступ до даних (варіанти) <ul><ul><li>Створення нових потоків </li></ul></ul><ul><li>new Thread() {   public void run() {     getContentResover().query(...);   } } .start(); </li></ul>
    23. 23. Асинхронний доступ до даних (варіанти) <ul><ul><li>AsyncTask </li></ul></ul><ul><li>new AsyncTask<String, Void, Cursor>() {   protected Cursor doInBackground(String... args) {     getContentResover().query(args[0], ...);   }   protected void onPostExecute(Cursor c) { </li></ul><ul><li>getListAdapter().changeCursor(c);  </li></ul><ul><li>} } .execute(&quot;some argument&quot;); </li></ul>
    24. 24. Асинхронний доступ до даних (варіанти) <ul><ul><li>AsyncQueryHandler </li></ul></ul><ul><li>asyncQueryHandler.startQuery(...); </li></ul><ul><li>void onQueryComplete(...) { </li></ul><ul><li>  // GUI thread </li></ul><ul><li>} </li></ul>
    25. 25. Асинхронний доступ до даних (варіанти) <ul><ul><li>Запуск сервісу </li></ul></ul><ul><li>context.startService(  </li></ul><ul><li>new Intent(...) </li></ul><ul><li>  .putExtra(&quot;resultReceiver&quot;, new  ResultReceiver() { </li></ul><ul><li>     protected void onReceiveResult(...) { </li></ul><ul><li>      // process results </li></ul><ul><li>    } </li></ul><ul><li>  }) </li></ul><ul><li>); </li></ul>
    26. 26. Продовжуємо <ul><ul><li>Безпека </li></ul></ul><ul><ul><li>Дані користувача </li></ul></ul><ul><ul><li>Ідентифікація користувача </li></ul></ul><ul><ul><li>Основний (GUI) потік </li></ul></ul><ul><ul><li>Асинхронний доступ до даних </li></ul></ul><ul><ul><li>Організація роботи з віддаленим сервером </li></ul></ul><ul><ul><li>Відлагодження та оптимізація </li></ul></ul>
    27. 27. Організація роботи з віддаленим сервером
    28. 28. Організація роботи з віддаленим сервером &quot;Хочу отримати твіти поточного користувача&quot; або &quot;Відправ запит за урлом методом GET з параметром user_id=7 &quot;
    29. 29. Організація роботи з віддаленим сервером &quot;пих-пих...&quot; &quot;о, дані, парсимо...&quot;
    30. 30. Організація роботи з віддаленим сервером &quot;Ось тобі дані, візьми&quot; або &quot;Я дані зберіг, можеш оновитися за таким URI&quot;
    31. 31. Продовжуємо <ul><ul><li>Безпека </li></ul></ul><ul><ul><li>Дані користувача </li></ul></ul><ul><ul><li>Ідентифікація користувача </li></ul></ul><ul><ul><li>Основний (GUI) потік </li></ul></ul><ul><ul><li>Асинхронний доступ до даних </li></ul></ul><ul><ul><li>Організація роботи з віддаленим сервером </li></ul></ul><ul><ul><li>Відлагодження та оптимізація </li></ul></ul>
    32. 32. Відлагодження та оптимізація Найцікавіше!
    33. 33. Як тестувати? <ul><ul><li>Перевертайте екран на симуляторі! </li></ul></ul><ul><ul><li>Запускайте на симуляторах з різною густиною пікселів, розміром екрану. </li></ul></ul><ul><ul><li>Тестуйте на пристроях. </li></ul></ul><ul><ul><ul><li>повільніші процесори </li></ul></ul></ul><ul><ul><ul><li>повільніша мобільна мережа </li></ul></ul></ul><ul><ul><ul><li>місцезнаходження </li></ul></ul></ul>
    34. 34. Відлагодження <ul><ul><li>Logcat if (DEBUG) { Log.v(TAG, &quot;Your message&quot;); } </li></ul></ul><ul><ul><li>Бряки, Eclipse IDE </li></ul></ul><ul><ul><li>Емуляція нестачі пам'яті echo &quot;1536,2048,4096,5120,15360,23040&quot; > /sys/module/lowmemorykiller/parameters/minfree </li></ul></ul>
    35. 35. Відлагодження <ul><ul><li>Профайлер методів: DDMS або Debug.startMethodTracing() </li></ul></ul><ul><ul><li>Відстеження алокації пам'яті (DDMS - Start Allocation Tracking) </li></ul></ul><ul><ul><li>Аналіз дампів пам'яті </li></ul></ul>
    36. 36. Оптимізація <ul><ul><li>Запис в базу даних: batch operations + транзакції + InsertHelper </li></ul></ul><ul><ul><li>Views: </li></ul></ul><ul><ul><ul><li>не створюйте Paint чи Path в onDraw() </li></ul></ul></ul><ul><ul><ul><li>перевикористовуйте бітмапи + bitmap.recycle() </li></ul></ul></ul><ul><ul><ul><li>мінімізуйте дерева! + власні ViewGroup </li></ul></ul></ul><ul><ul><li>Анімації: </li></ul></ul><ul><ul><ul><li>мінімізуйте активність GC </li></ul></ul></ul><ul><ul><ul><li>не завантажуйте малюнки, поки скролиться список </li></ul></ul></ul>
    37. 37. Якщо я зараз збираюся завершувати розповідь, зупиніть мене!
    38. 38. Підключіть сурси Android до вашого IDE!
    39. 39. І все тільки починається! Роман Мазур Керівник Android/Java відділу Stanfy [email_address] Skype: roman.mazur.f

    ×