5. Каналы уведомлений
CharSequence name = getString(R.string.noti_channel_group_default);
NotificationChannelGroup group =
new NotificationChannelGroup(DEFAULT_CHANNELS_GROUP_ID, name);
mNotificationManager.createNotificationChannelGroup(group);
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. Title with black text on black is background is bug of Android O Preview 1
8. Свойства каналов
• Приоритет
• Звук
• Управление светодиодом
• Вибрация
• Отображение на заблокированном экране
• Badge в Launcher
9. Изменения в Notifications API
• Канал обязателен для все Notification
• Приоритет Notification не дает эффекта,
используйте приоритеты каналов.
• NotificationListenerService теперь может
понимать кем было удалено уведомление:
пользователем или приложением, с помощью
нового метода onNotificationRemoved()
10. Изменения в Notification.Builder API
• Notification.Builder(Context)
Используйте Notification.Builder(Context, String)
• setTimeout()
Задает время после которого уведомление будет удалено
• setColorized()
Разукрашивать ли фон уведомления в цвет, который задан с
помощью метода setColor()
• chooseBadgeIcon()
Тип иконки, который будет использовать как badge для
уведомления
• setShortcutId()
Launcher может спрятать Shortcut, который дублирует уведомления.
Работает только в случае если Launcher поддерживает Shortcut
14. Ограничение фоновых задач
• Не применяются для Foreground приложения
• Не применяются для Bounded Service-ов
• Система добавляет фоновые приложения во
временный белый список на несколько минут в
случае если:
• Обработка high-priority FCM push
• Получение broadcast
• Выполнение PendingIntent
• Применяется только для приложения с
targetSdk=O
15. Foreground Apps
• Есть видимая Activity (started or paused)
• Есть foreground Service
• Другое foreground приложение связано с
приложение
Service приложения используется через Binding или
используется ContentProvider приложения
18. Ограничения Broadcast
• Приложения больше не могут регистрировать
Broadcast Receivers для неявных Broadcast в
Манифесте приложения
• Для явных Broadcast это не применяется
• Регистрация на Broadcast во время работы
приложения с помощью Context.registerReceiver()
работает без изменений
• Ограничения применяются только к приложения с
targetSdk=O
• Некоторые неявные Broadcast все также можно
регистрировать
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
22. JobScheduler
• Условия сети
• Состояние зарядки
• Находится ли устройство в простое (Idle state)
• Время выполнения
• Периодичность выполнения
• Крайний срок выполнения
• Политику повтора выполнения при ошибке
• Сохранять ли работы между перезагрузками
• Может выполнять работы при изменение контента в
ContentProvider
• Работает в ограничениях Doze Mode и App Standby
23. Другие ограничения фоновых операций
• Система убирает все Wakelock когда приложение
переходит в кэшированное состояние (нет активных
компонентов)
• Приложение в фоне получается обновление
местоположения только несколько раз в час
* Может быть изменено в следующих DP
• Service.startForeground() больше не работает.
Используйте NotificationManager.startServiceInForeground()
Применяется только для приложений с targetSdk=O
• Context.startService() теперь бросает исключение
IllegalStateExceptions, если приложение попытается
использовать этот метод в случае когда Service
становится restricted
30. Новые правила для иконок в launcher
• Иконка, которая состоит из 2 слоев:
внутреннего и фонового слоев
• Оба слоя должны иметь размер 108 × 108 dp
• Внутренний слой иконки должен
отрисовываться в зоне 72 × 72 dp
• Зона вокруг иконки в 36 dp в каждой стороне
зарезервирована для визуальных эффектов
34. Autosizing TextView
• Granularity
Выбираем наилучший размер текста на основе доступного
места в интервале между минимальным и максимальным
размером, и размер шага
• Preset Sizes
Выбирается наилучший размер из списка заданных
38. Java 8 DateTime
• Отдельный классы для даты и времени
• Классы для представления периодов (Period) и
интервалов (Duration)
• Немодифицируемые
• Потокобезопасные
*Можно использовать backport Java 8 DateTime - ThreeTenAbp
39. Java 7/8 NIO API
• Path
• Stream API для файлов
• Работа с информацией о файовой системе
• WatchService
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
42. Fragment
• Действия на выполнение транзакции Fragment
FragmentTransaction.postOnCommit(Runnable)
• Fragment lifecycle callback
• Главный (Primary) Fragment
• Оптимизации для транзакций Fragment-ов
43. Permissions
• Все разрешения должны запрашиваться явным
образом
Когда пользователь предоставляет разрешение приложения,
остальные разрешения в этой группе не предоставляются
автоматически. Их надо запрашивать явным образом, но они
будут предоставлены автоматом.
• android.permission.ANSWER_PHONE_CALLS
Allows apps to answer incoming phone calls
Позволяет приложения отвечать на входящие звонки
Относится к dangerous
Является частью группы PHONE
44. RecoverableSecurityException
• Содержит локализованное сообщение об
ошибке, которое можно показать пользователю
• Метод для показа сообщения диалогом
• Метод для пока сообщения в виде системного
уведомления
• Предоставляет RemoteAction, который
позволяет запустить процесс восстановления
из любого процесса, напрямую в ваш UI
45. Cached data
• StorageManager.getCacheQuotaBytes()
Объем памяти доступный для кэшированных данных приложения
• Новая механизм очистки кэша в системе:
• StorageManager.setCacheBehaviorAtomic()
Все файлы в папке удаляются вместе
• StorageManager.setCacheBehaviorTombstone()
Файлы не удалются, но они становятся пустыми
• Выделение дискового пространства для файлов с помощью
StorageManager.allocateBytes()
Автоматически выделит необходимое количество дискового пространства, очистив
кэш если это необходимо
• Используйте StorageManager.getAllocatableBytes() вместо
File.getUsableSpace() для проверки того что на устройстве
достаточно места для хранения новых данных
Будет проверено доступное свободное место, и кэш который система сможет
очистить для вашего приложения
46. Content Provider
• Новый метод запроса с параметрами выборки &
сортировки в виде Bundle
• Принудительно обновление данных по
заданному URI
refresh(Uri, Bundle, CancelationSignal)
• Пагинация запросов
48. Content Provider
• Новый метод запроса с параметрами выборки &
сортировки в виде Bundle
• Принудительно обновление данных по
заданному URI
refresh(Uri, Bundle, CancelationSignal)
• Пагинация запросов
• Изменение данных в статистике использования
контактов для всех приложений
Запросы о использование данных теперь возвращают
примерные данные, вместо точных для TIMES_CONTACTED,
TIMES_USED, LAST_TIME_CONTACTED, LAST_TIME_USED
49. Поддержка нескольких дисплеев
• Улучшенная поддержка нескольких дисплеев
• Можно перемещать Activity между дисплеями
• Когда Activity перемещается между дисплеями,
система изменяет размер Activity и оповещает
об изменение конфигурации, если это
необходимо,
• ActivityOptions содержит новые методы для
управления дисплеем на котором запускается
Activity
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. Strict mode
• ThreadPolicy.Builder.detectUnbufferedIo()
Определяет когда приложение использу IO без буферизации
• VmPolicy.Builder.detectContentUriWithoutPermission()
Определяет когда приложения не предоставляет разрешения
стороннему приложения, когда запуска Activity вне вашего
приложения
• VmPolicy.Builder.detectUntaggedSockets()
Определяет когда ваше приложения использует сетевые.
операции без использования TrafficStats.setThreadStateTag()
для пометки сетевого трафика с целью его отладки
52. Категоризация приложений
• Используется для объединения приложений с
одинаковыми целями при отображение их
пользователю, например в мониторе
использования данных или расхода батареи
• Необходимо задать атрибут android:appCategory
в тэге <application> манифеста вашего
приложения
54. AccountManager API
• Управление видимостью аккаунтов для других
приложений
• Теперь можно слушать изменения аккаунтов только
для заданных типов аккаунтов
• Теперь приложение может получить доступ к
аккаунтам, только если аутентикатор создал этот
аккаунт, либо пользователь дал доступ приложению
Разрешение GET_ACCOUNTS больше недостаточно. Необходимо
использовать AccountManager.newChooseAccountIntent() для
получения доступа
• LOGIN_ACCOUNTS_CHANGED_ACTIONS
Используйте AccountManager.addOnAccountsUpdatedListener() во
время работы приложения
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. Изменения Alert Windows
Приложения которые используют разрешение
SYSTEM_ALERT_WINDOW и используют один из
перечисленных типов Alert Window:
• TYPE_PHONE
• TYPE_PRIORITY_PHONE
• TYPE_SYSTEM_ALERT
• TYPE_SYSTEM_OVERLAY
• TYPE_SYSTEM_ERROR
57. Изменения Alert Windows
• Приложения больше не могут больше
использовать перечисленные типы окон
Используйте новый тип окон - TYPE_APPLICATION_OVERLAY
• Окна с указанными типами будут показаны под
окном с типом TYPE_APPLICATION_OVERLAY
• Изменения касаются только приложений с
targetSdk=O
58. Другие обновления
• Возвращаемый тип в View.findViewById() и
View.findViewByTag() теперь типизированный
Больше не нужно привидений. Activity.findViewById() не
изменился (
• View Tooltip
60. Другие обновления
• Возвращаемый тип в View.findViewById() и
View.findViewByTag() теперь типизированный
• View Tooltip
• AnimatorSet seeking и обратное воспроизведение
• Обновления Android ICU до версии 58
• Settings.Secure.ANDROID_ID уникальное для каждого
приложения и пользователя
• SSLv3 больше не поддерживается
• Приложения, которые устанавливают другие
приложения, должны получить доступ через систему
61. Другие обновления
• PreferenceManages.setDataStore(PreferenceDataStore)
Позволяет задать свое собственное хранилище для всех данных
в PreferenceManager. Альтернатива SharedPreference
• Build.SERIAL
Используйте Build.getSerial().
Необходимо разрешение READ_PHONE_STATE
• android.app.ProgressDialog
• Режим цвета в конфигурации устройства
• Обновление API Picture-In-Picture
• Улучшения в Storage Access Framework
62. Новые функции
• Autofill Framework
• Shortcuts & Widget Pinning
• Picture-in-Picture на всех платформах
• Управление цветом
• Wi-Fi Aware
• Companion device pairing
• Обновление Accessibility
• Улучшения медиа фреймворка
• LDAC
63. Program overview
DP1 - alpha
DP2 - beta (Google I/O 2017?)
DP3 - Final APIs & SDK, Play publishing
DP4 - pre-final images