2. Продовжуємо Безпека Дані користувача Ідентифікація користувача Основний (GUI) потік Асинхронний доступ до даних Організація роботи з віддаленим сервером Відлагодження та оптимізація
3. Продовжуємо Безпека Дані користувача Ідентифікація користувача Основний (GUI) потік Асинхронний доступ до даних Організація роботи з віддаленим сервером Відлагодження та оптимізація
4. Безпека Система відкрита, але кожен з додатків має свою пісочницю За замовчуванням доступ до ваших ресурсів закритий Можна оголосити права, якими повинен володіти той, хто виконує доступ до ваших ресурсів Права не можна отримати динамічно Розмежування відбувається на рівні ОС, тому не залежить від того, що ви використовуєте: NDK чи SDK
5. Безпека Додатки підписуються сертифікатами, сертифікати - "самопідписні" Мета - ідентифікувати авторів додатків для введення поняття прав на рівні підписів Кожен додаток має свого користувача, ті хто підписані одним сертифікатом можуть мати спільного користувача
9. Продовжуємо Безпека Дані користувача Ідентифікація користувача Основний (GUI) потік Асинхронний доступ до даних Організація роботи з віддаленим сервером Відлагодження та оптимізація
13. Продовжуємо Безпека Дані користувача Ідентифікація користувача Основний (GUI) потік Асинхронний доступ до даних Організація роботи з віддаленим сервером Відлагодження та оптимізація
14. Ідентифікація Насправді немає унікального ідентифікатору пристрою TelephonyManager.getDeviceId() - IMEI, MEID, ESN MAC-адреса android.os.Build.SERIAL - з 2.3 Settings.Secure.ANDROID_ID
17. Продовжуємо Безпека Дані користувача Ідентифікація користувача Основний (GUI) потік Асинхронний доступ до даних Організація роботи з віддаленим сервером Відлагодження та оптимізація
18. Основний (GUI) потік Кожен потік має свій екземпляр Looper , який обробляє чергу повідомлень Події від усіх компонентів передаються в Looper (наприклад, події в GUI – від View, поява Intent)
20. Основний (GUI) потік Виклики методів життєвих циклів компонентів завжди проходять в основному потокові Будьте швидкими! HandlerThread - потік з Looper
21. Продовжуємо Безпека Дані користувача Ідентифікація користувача Основний (GUI) потік Асинхронний доступ до даних Організація роботи з віддаленим сервером Відлагодження та оптимізація
22. Асинхронний доступ до даних (варіанти) Створення нових потоків new Thread() { public void run() { getContentResover().query(...); } } .start();
23. Асинхронний доступ до даних (варіанти) AsyncTask new AsyncTask<String, Void, Cursor>() { protected Cursor doInBackground(String... args) { getContentResover().query(args[0], ...); } protected void onPostExecute(Cursor c) { getListAdapter().changeCursor(c); } } .execute("some argument");
24. Асинхронний доступ до даних (варіанти) AsyncQueryHandler asyncQueryHandler.startQuery(...); void onQueryComplete(...) { // GUI thread }
25. Асинхронний доступ до даних (варіанти) Запуск сервісу context.startService( new Intent(...) .putExtra("resultReceiver", new ResultReceiver() { protected void onReceiveResult(...) { // process results } }) );
26. Продовжуємо Безпека Дані користувача Ідентифікація користувача Основний (GUI) потік Асинхронний доступ до даних Організація роботи з віддаленим сервером Відлагодження та оптимізація
28. Організація роботи з віддаленим сервером "Хочу отримати твіти поточного користувача" або "Відправ запит за урлом методом GET з параметром user_id=7 "
29. Організація роботи з віддаленим сервером "пих-пих..." "о, дані, парсимо..."
30. Організація роботи з віддаленим сервером "Ось тобі дані, візьми" або "Я дані зберіг, можеш оновитися за таким URI"
31. Продовжуємо Безпека Дані користувача Ідентифікація користувача Основний (GUI) потік Асинхронний доступ до даних Організація роботи з віддаленим сервером Відлагодження та оптимізація
33. Як тестувати? Перевертайте екран на симуляторі! Запускайте на симуляторах з різною густиною пікселів, розміром екрану. Тестуйте на пристроях. повільніші процесори повільніша мобільна мережа місцезнаходження
34. Відлагодження Logcat if (DEBUG) { Log.v(TAG, "Your message"); } Бряки, Eclipse IDE Емуляція нестачі пам'яті echo "1536,2048,4096,5120,15360,23040" > /sys/module/lowmemorykiller/parameters/minfree
35. Відлагодження Профайлер методів: DDMS або Debug.startMethodTracing() Відстеження алокації пам'яті (DDMS - Start Allocation Tracking) Аналіз дампів пам'яті
36. Оптимізація Запис в базу даних: batch operations + транзакції + InsertHelper Views: не створюйте Paint чи Path в onDraw() перевикористовуйте бітмапи + bitmap.recycle() мінімізуйте дерева! + власні ViewGroup Анімації: мінімізуйте активність GC не завантажуйте малюнки, поки скролиться список
37. Якщо я зараз збираюся завершувати розповідь, зупиніть мене!