Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

Что нового в Android O (Grodno HTP)

419 vues

Publié le

Презентация к докладу в Гродненском отделение ПВТ о том что же нового для разработчиков в Android O.

Publié dans : Mobile
  • Soyez le premier à commenter

Что нового в Android O (Grodno HTP)

  1. 1. Что нового в Android O
  2. 2. Каналы уведомлений
  3. 3. Каналы уведомлений NotificationChannel channel = new NotificationChannel( PRIMARY_CHANNEL, getString(R.string.noti_channel_default), NotificationManager.IMPORTANCE_DEFAULT); channel.setLightColor(Color.GREEN); channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE); mNotificationManager.createNotificationChannel(channel);
  4. 4. Каналы уведомлений NotificationChannel channel = new NotificationChannel( PRIMARY_CHANNEL, getString(R.string.noti_channel_default), NotificationManager.IMPORTANCE_DEFAULT); channel.setLightColor(Color.GREEN); channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE); mNotificationManager.createNotificationChannel(channel); new Notification.Builder(context, PRIMARY_CHANNEL) .setContentTitle(title) .setContentText(body) .setSmallIcon(getSmallIcon()) .setAutoCancel(true)
  5. 5. Каналы уведомлений CharSequence name = getString(R.string.noti_channel_group_default); NotificationChannelGroup group = new NotificationChannelGroup(DEFAULT_CHANNELS_GROUP_ID, name); mNotificationManager.createNotificationChannelGroup(group);
  6. 6. Каналы уведомлений CharSequence name = getString(R.string.noti_channel_group_default); NotificationChannelGroup group = new NotificationChannelGroup(DEFAULT_CHANNELS_GROUP_ID, name); mNotificationManager.createNotificationChannelGroup(group); NotificationChannel channel = new NotificationChannel( PRIMARY_CHANNEL, getString(R.string.noti_channel_default), NotificationManager.IMPORTANCE_DEFAULT); channel.setGroup(DEFAULT_CHANNELS_GROUP_ID); mNotificationManager.createNotificationChannel(channel);
  7. 7. Title with black text on black is background is bug of Android O Preview 1
  8. 8. Свойства каналов • Приоритет • Звук • Управление светодиодом • Вибрация • Отображение на заблокированном экране • Badge в Launcher
  9. 9. Изменения в Notifications API • Канал обязателен для все Notification • Приоритет Notification не дает эффекта, используйте приоритеты каналов. • NotificationListenerService теперь может понимать кем было удалено уведомление: пользователем или приложением, с помощью нового метода onNotificationRemoved()
  10. 10. Изменения в Notification.Builder API • Notification.Builder(Context)
 Используйте Notification.Builder(Context, String) • setTimeout()
 Задает время после которого уведомление будет удалено • setColorized()
 Разукрашивать ли фон уведомления в цвет, который задан с помощью метода setColor() • chooseBadgeIcon()
 Тип иконки, который будет использовать как badge для уведомления • setShortcutId()
 Launcher может спрятать Shortcut, который дублирует уведомления. Работает только в случае если Launcher поддерживает Shortcut
  11. 11. Ограничения Service
  12. 12. Ограничения Service Foreground Processes Visible Processes Service Processes Background Processes Empty Processes
  13. 13. Ограничения Service Foreground Processes Visible Processes Service Processes
 (several minutes) Background Processes Empty Processes
  14. 14. Ограничение фоновых задач • Не применяются для Foreground приложения • Не применяются для Bounded Service-ов • Система добавляет фоновые приложения во временный белый список на несколько минут в случае если: • Обработка high-priority FCM push • Получение broadcast • Выполнение PendingIntent • Применяется только для приложения с targetSdk=O
  15. 15. Foreground Apps • Есть видимая Activity (started or paused) • Есть foreground Service • Другое foreground приложение связано с приложение
 Service приложения используется через Binding или используется ContentProvider приложения
  16. 16. Ограничения Broadcast
  17. 17. <receiver android:name=".SampleReceiver"> <intent-filter> <action android:name=“android.intent.action.PACKAGE_ADDED” /> </intent-filter> </receiver>Не работает в Android O Ограничения Broadcast
  18. 18. Ограничения Broadcast • Приложения больше не могут регистрировать Broadcast Receivers для неявных Broadcast в Манифесте приложения • Для явных Broadcast это не применяется • Регистрация на Broadcast во время работы приложения с помощью Context.registerReceiver() работает без изменений • Ограничения применяются только к приложения с targetSdk=O • Некоторые неявные Broadcast все также можно регистрировать
  19. 19. Исключения • ACTION_LOCALE_CHANGED • ACTION_HEADSET_PLUG • ACTION_CONNECTION_STATE_CHANGED
 For BluetoothHeadset • ACTION_NEW_OUTGOING_CALL • ACTION_PACKAGE_FULLY_REMOVED • ACTION_DEVICE_STORAGE_LOW *Этот список может измениться до финального релиза SDK
  20. 20. ЧТО ДЕЛАТЬ ???
  21. 21. JobScheduler
  22. 22. JobScheduler • Условия сети • Состояние зарядки • Находится ли устройство в простое (Idle state) • Время выполнения • Периодичность выполнения • Крайний срок выполнения • Политику повтора выполнения при ошибке • Сохранять ли работы между перезагрузками • Может выполнять работы при изменение контента в ContentProvider • Работает в ограничениях Doze Mode и App Standby
  23. 23. Другие ограничения фоновых операций • Система убирает все Wakelock когда приложение переходит в кэшированное состояние (нет активных компонентов) • Приложение в фоне получается обновление местоположения только несколько раз в час
 * Может быть изменено в следующих DP • Service.startForeground() больше не работает. Используйте NotificationManager.startServiceInForeground()
 Применяется только для приложений с targetSdk=O • Context.startService() теперь бросает исключение IllegalStateExceptions, если приложение попытается использовать этот метод в случае когда Service становится restricted
  24. 24. Ресурсы шрифтов
  25. 25. Ресурсы шрифтов
  26. 26. Семейства шрифтов <?xml version="1.0" encoding="utf-8"?> <font-family xmlns:android="http://schemas.android.com/apk/res/android">     <font         android:fontStyle="normal"         android:fontWeight="400"         android:font=“@font/lobster_regular" />     <font         android:fontStyle="italic"         android:fontWeight="400"         android:font=“@font/lobster_italic" /> </font-family>
  27. 27. Задание шрифтов в TextView <TextView         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:fontFamily="@font/lobster"/> <style name=“TextAppearance.CustomFont” parent="@android:style/TextAppearance.Small">     <item name="android:fontFamily">@font/lobster</item> </style> Typeface typeface = getResources().getFont(R.font.lobster); textView.setTypeface(typeface);
  28. 28. Адаптивные иконки
  29. 29. Адаптивные иконки
  30. 30. Новые правила для иконок в launcher • Иконка, которая состоит из 2 слоев: внутреннего и фонового слоев • Оба слоя должны иметь размер 108 × 108 dp • Внутренний слой иконки должен отрисовываться в зоне 72 × 72 dp • Зона вокруг иконки в 36 dp в каждой стороне зарезервирована для визуальных эффектов
  31. 31. Визуальные эффекты
  32. 32. Пример <maskable-icon>     <background android:drawable="@color/ic_background"/>     <foreground android:drawable="@mipmap/ic_foreground"/> </maskable-icon>
  33. 33. Autosizing TextView
  34. 34. Autosizing TextView • Granularity
 Выбираем наилучший размер текста на основе доступного места в интервале между минимальным и максимальным размером, и размер шага • Preset Sizes
 Выбирается наилучший размер из списка заданных
  35. 35. Granularity Autosizing <TextView   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:autoSizeText="uniform"   android:autoSizeMinTextSize="12sp"   android:autoSizeMaxTextSize="100sp"   android:autoSizeStepGranularity="2sp" />
  36. 36. Preset Sizes Autosizing <resources>     <array name="autosize_text_sizes">         <item>10sp</item>         <item>12sp</item>         <item>20sp</item>         <item>40sp</item>         <item>100sp</item>     </array> </resources> <TextView   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:autoSizeText="uniform"   android:autoSizePresetSizes= "@array/autosize_text_sizes" />
  37. 37. Обновления Java API
  38. 38. Java 8 DateTime • Отдельный классы для даты и времени • Классы для представления периодов (Period) и интервалов (Duration) • Немодифицируемые • Потокобезопасные *Можно использовать backport Java 8 DateTime - ThreeTenAbp
  39. 39. Java 7/8 NIO API • Path • Stream API для файлов • Работа с информацией о файовой системе • WatchService
  40. 40. Другие обновления Java API • java.lang.invoke
 Поддержка динамических языков, предоставляемая напрямую core Java классами и виртуальной машиной • java.util.Collections • Collections.sort() реализован на основе List.sort()
 Оптимизация скорости Collections.sort().
 Не используйте Collections.sort() из List.sort() • Добавлены checked, empty, synchronised и unmodifiable методы-обертки для NavigableMap и NavigableSet
  41. 41. Обновления Android SDK
  42. 42. Fragment • Действия на выполнение транзакции Fragment
 FragmentTransaction.postOnCommit(Runnable) • Fragment lifecycle callback • Главный (Primary) Fragment • Оптимизации для транзакций Fragment-ов
  43. 43. Permissions • Все разрешения должны запрашиваться явным образом
 Когда пользователь предоставляет разрешение приложения, остальные разрешения в этой группе не предоставляются автоматически. Их надо запрашивать явным образом, но они будут предоставлены автоматом. • android.permission.ANSWER_PHONE_CALLS
 Allows apps to answer incoming phone calls
 Позволяет приложения отвечать на входящие звонки
 Относится к dangerous
 Является частью группы PHONE
  44. 44. RecoverableSecurityException • Содержит локализованное сообщение об ошибке, которое можно показать пользователю • Метод для показа сообщения диалогом • Метод для пока сообщения в виде системного уведомления • Предоставляет RemoteAction, который позволяет запустить процесс восстановления из любого процесса, напрямую в ваш UI
  45. 45. Cached data • StorageManager.getCacheQuotaBytes()
 Объем памяти доступный для кэшированных данных приложения • Новая механизм очистки кэша в системе: • StorageManager.setCacheBehaviorAtomic()
 Все файлы в папке удаляются вместе • StorageManager.setCacheBehaviorTombstone()
 Файлы не удалются, но они становятся пустыми • Выделение дискового пространства для файлов с помощью StorageManager.allocateBytes()
 Автоматически выделит необходимое количество дискового пространства, очистив кэш если это необходимо • Используйте StorageManager.getAllocatableBytes() вместо File.getUsableSpace() для проверки того что на устройстве достаточно места для хранения новых данных
 Будет проверено доступное свободное место, и кэш который система сможет очистить для вашего приложения
  46. 46. Content Provider • Новый метод запроса с параметрами выборки & сортировки в виде Bundle • Принудительно обновление данных по заданному URI
 refresh(Uri, Bundle, CancelationSignal) • Пагинация запросов
  47. 47. Content Provider // Создаем Bundle с параметрами запроса Bundle queryArgs = new Bundle(4); queryArgs.putString( ContentResolver.QUERY_ARG_SQL_SELECTION, …); queryArgs.putStringArrayList( ContentResolver.QUERY_ARG_SQL_SELECTION_ARGS, …); queryArgs.putInt(ContentResolver.QUERY_ARG_OFFSET, 0); queryArgs.putInt(ContentResolver.QUERY_ARG_LIMIT, 100); Uri contentUri = …; context.getContentResolver().query(contentUri, queryArgs, null);
  48. 48. Content Provider • Новый метод запроса с параметрами выборки & сортировки в виде Bundle • Принудительно обновление данных по заданному URI
 refresh(Uri, Bundle, CancelationSignal) • Пагинация запросов • Изменение данных в статистике использования контактов для всех приложений
 Запросы о использование данных теперь возвращают примерные данные, вместо точных для TIMES_CONTACTED, TIMES_USED, LAST_TIME_CONTACTED, LAST_TIME_USED
  49. 49. Поддержка нескольких дисплеев • Улучшенная поддержка нескольких дисплеев • Можно перемещать Activity между дисплеями • Когда Activity перемещается между дисплеями, система изменяет размер Activity и оповещает об изменение конфигурации, если это необходимо, • ActivityOptions содержит новые методы для управления дисплеем на котором запускается Activity
  50. 50. WebView APIs • Multiprocess WebView
 Содержимое WebView обрабатывается в отдельном процессе, изолированном от процесса приложения • Version API
 Позволяет получать информацию о приложение, отображающем web контент в вашем приложение • Google SafeBrowsing API
 Проверка URL, использую Google Safe Browsing • Termination Handle API
 Обработка ситуации, когда система убивает процесс, в котором происходит рендеринг содержимого WebView • Renderer Importance API
 Позволяет задавать приоритет рендеринга. Необходимо использовать в связке с Termination Handle API
  51. 51. Strict mode • ThreadPolicy.Builder.detectUnbufferedIo()
 Определяет когда приложение использу IO без буферизации • VmPolicy.Builder.detectContentUriWithoutPermission()
 Определяет когда приложения не предоставляет разрешения стороннему приложения, когда запуска Activity вне вашего приложения • VmPolicy.Builder.detectUntaggedSockets()
 Определяет когда ваше приложения использует сетевые. операции без использования TrafficStats.setThreadStateTag() для пометки сетевого трафика с целью его отладки
  52. 52. Категоризация приложений • Используется для объединения приложений с одинаковыми целями при отображение их пользователю, например в мониторе использования данных или расхода батареи • Необходимо задать атрибут android:appCategory в тэге <application> манифеста вашего приложения
  53. 53. Категоризация приложений • audio • game • image • maps • news • productivity • social • video
  54. 54. AccountManager API • Управление видимостью аккаунтов для других приложений • Теперь можно слушать изменения аккаунтов только для заданных типов аккаунтов • Теперь приложение может получить доступ к аккаунтам, только если аутентикатор создал этот аккаунт, либо пользователь дал доступ приложению 
 Разрешение GET_ACCOUNTS больше недостаточно. Необходимо использовать AccountManager.newChooseAccountIntent() для получения доступа • LOGIN_ACCOUNTS_CHANGED_ACTIONS
 Используйте AccountManager.addOnAccountsUpdatedListener() во время работы приложения
  55. 55. Smart sharing Intent intent = new Intent(Intent.ACTION_CHOOSER); ArrayList<String> annotations = new ArrayList<>(3); annotations.add("person"); annotations.add("selfie"); annotations.add("child"); intent.putStringArrayListExtra(     Intent.EXTRA_CONTENT_ANNOTATIONS, annotations);
  56. 56. Изменения Alert Windows Приложения которые используют разрешение SYSTEM_ALERT_WINDOW и используют один из перечисленных типов Alert Window: • TYPE_PHONE • TYPE_PRIORITY_PHONE • TYPE_SYSTEM_ALERT • TYPE_SYSTEM_OVERLAY • TYPE_SYSTEM_ERROR
  57. 57. Изменения Alert Windows • Приложения больше не могут больше использовать перечисленные типы окон
 Используйте новый тип окон - TYPE_APPLICATION_OVERLAY • Окна с указанными типами будут показаны под окном с типом TYPE_APPLICATION_OVERLAY • Изменения касаются только приложений с targetSdk=O
  58. 58. Другие обновления • Возвращаемый тип в View.findViewById() и View.findViewByTag() теперь типизированный
 Больше не нужно привидений. Activity.findViewById() не изменился ( • View Tooltip
  59. 59. Другие обновления
  60. 60. Другие обновления • Возвращаемый тип в View.findViewById() и View.findViewByTag() теперь типизированный • View Tooltip • AnimatorSet seeking и обратное воспроизведение • Обновления Android ICU до версии 58 • Settings.Secure.ANDROID_ID уникальное для каждого приложения и пользователя • SSLv3 больше не поддерживается • Приложения, которые устанавливают другие приложения, должны получить доступ через систему
  61. 61. Другие обновления • PreferenceManages.setDataStore(PreferenceDataStore)
 Позволяет задать свое собственное хранилище для всех данных в PreferenceManager. Альтернатива SharedPreference • Build.SERIAL
 Используйте Build.getSerial().
 Необходимо разрешение READ_PHONE_STATE • android.app.ProgressDialog • Режим цвета в конфигурации устройства • Обновление API Picture-In-Picture • Улучшения в Storage Access Framework
  62. 62. Новые функции • Autofill Framework • Shortcuts & Widget Pinning • Picture-in-Picture на всех платформах • Управление цветом • Wi-Fi Aware • Companion device pairing • Обновление Accessibility • Улучшения медиа фреймворка • LDAC
  63. 63. Program overview DP1 - alpha DP2 - beta (Google I/O 2017?) DP3 - Final APIs & SDK, Play publishing
 DP4 - pre-final images
  64. 64. Больше об Android O на
 d.android.com/preview
  65. 65. Спасибо за внимание!

×