Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

1,639 views

Published on

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

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Розробка під 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

×