Что нового в
Android O
Каналы уведомлений
Каналы уведомлений
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);
Каналы уведомлений
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)
Каналы уведомлений
CharSequence name = getString(R.string.noti_channel_group_default);
NotificationChannelGroup group =
new NotificationChannelGroup(DEFAULT_CHANNELS_GROUP_ID, name);
mNotificationManager.createNotificationChannelGroup(group);
Каналы уведомлений
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);
Title with black text on black is background is bug of Android O Preview 1
Свойства каналов
• Приоритет
• Звук
• Управление светодиодом
• Вибрация
• Отображение на заблокированном экране
• Badge в Launcher
Изменения в Notifications API
• Канал обязателен для все Notification
• Приоритет Notification не дает эффекта,
используйте приоритеты каналов.
• NotificationListenerService теперь может
понимать кем было удалено уведомление:
пользователем или приложением, с помощью
нового метода onNotificationRemoved()
Изменения в Notification.Builder API
• Notification.Builder(Context)

Используйте Notification.Builder(Context, String)
• setTimeout()

Задает время после которого уведомление будет удалено
• setColorized()

Разукрашивать ли фон уведомления в цвет, который задан с
помощью метода setColor()
• chooseBadgeIcon()

Тип иконки, который будет использовать как badge для
уведомления
• setShortcutId()

Launcher может спрятать Shortcut, который дублирует уведомления.
Работает только в случае если Launcher поддерживает Shortcut
Ограничения Service
Ограничения Service
Foreground Processes
Visible Processes
Service Processes
Background Processes
Empty Processes
Ограничения Service
Foreground Processes
Visible Processes
Service Processes

(several minutes)
Background Processes
Empty Processes
Ограничение фоновых задач
• Не применяются для Foreground приложения
• Не применяются для Bounded Service-ов
• Система добавляет фоновые приложения во
временный белый список на несколько минут в
случае если:
• Обработка high-priority FCM push
• Получение broadcast
• Выполнение PendingIntent
• Применяется только для приложения с
targetSdk=O
Foreground Apps
• Есть видимая Activity (started or paused)
• Есть foreground Service
• Другое foreground приложение связано с
приложение

Service приложения используется через Binding или
используется ContentProvider приложения
Ограничения Broadcast
<receiver android:name=".SampleReceiver">
<intent-filter>
<action
android:name=“android.intent.action.PACKAGE_ADDED”
/>
</intent-filter>
</receiver>Не работает
в Android O
Ограничения Broadcast
Ограничения Broadcast
• Приложения больше не могут регистрировать
Broadcast Receivers для неявных Broadcast в
Манифесте приложения
• Для явных Broadcast это не применяется
• Регистрация на Broadcast во время работы
приложения с помощью Context.registerReceiver()
работает без изменений
• Ограничения применяются только к приложения с
targetSdk=O
• Некоторые неявные Broadcast все также можно
регистрировать
Исключения
• 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
ЧТО ДЕЛАТЬ ???
JobScheduler
JobScheduler
• Условия сети
• Состояние зарядки
• Находится ли устройство в простое (Idle state)
• Время выполнения
• Периодичность выполнения
• Крайний срок выполнения
• Политику повтора выполнения при ошибке
• Сохранять ли работы между перезагрузками
• Может выполнять работы при изменение контента в
ContentProvider
• Работает в ограничениях Doze Mode и App Standby
Другие ограничения фоновых операций
• Система убирает все Wakelock когда приложение
переходит в кэшированное состояние (нет активных
компонентов)
• Приложение в фоне получается обновление
местоположения только несколько раз в час

* Может быть изменено в следующих DP
• Service.startForeground() больше не работает.
Используйте NotificationManager.startServiceInForeground()

Применяется только для приложений с targetSdk=O
• Context.startService() теперь бросает исключение
IllegalStateExceptions, если приложение попытается
использовать этот метод в случае когда Service
становится restricted
Ресурсы шрифтов
Ресурсы шрифтов
Семейства шрифтов
<?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>
Задание шрифтов в 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);
Адаптивные иконки
Адаптивные иконки
Новые правила для иконок в launcher
• Иконка, которая состоит из 2 слоев:
внутреннего и фонового слоев
• Оба слоя должны иметь размер 108 × 108 dp
• Внутренний слой иконки должен
отрисовываться в зоне 72 × 72 dp
• Зона вокруг иконки в 36 dp в каждой стороне
зарезервирована для визуальных эффектов
Визуальные эффекты
Пример
<maskable-icon>
    <background android:drawable="@color/ic_background"/>
    <foreground android:drawable="@mipmap/ic_foreground"/>
</maskable-icon>
Autosizing TextView
Autosizing TextView
• Granularity

Выбираем наилучший размер текста на основе доступного
места в интервале между минимальным и максимальным
размером, и размер шага
• Preset Sizes

Выбирается наилучший размер из списка заданных
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"
/>
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"
/>
Обновления Java API
Java 8 DateTime
• Отдельный классы для даты и времени
• Классы для представления периодов (Period) и
интервалов (Duration)
• Немодифицируемые
• Потокобезопасные
*Можно использовать backport Java 8 DateTime - ThreeTenAbp
Java 7/8 NIO API
• Path
• Stream API для файлов
• Работа с информацией о файовой системе
• WatchService
Другие обновления 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
Обновления Android SDK
Fragment
• Действия на выполнение транзакции Fragment

FragmentTransaction.postOnCommit(Runnable)
• Fragment lifecycle callback
• Главный (Primary) Fragment
• Оптимизации для транзакций Fragment-ов
Permissions
• Все разрешения должны запрашиваться явным
образом

Когда пользователь предоставляет разрешение приложения,
остальные разрешения в этой группе не предоставляются
автоматически. Их надо запрашивать явным образом, но они
будут предоставлены автоматом.
• android.permission.ANSWER_PHONE_CALLS

Allows apps to answer incoming phone calls

Позволяет приложения отвечать на входящие звонки

Относится к dangerous

Является частью группы PHONE
RecoverableSecurityException
• Содержит локализованное сообщение об
ошибке, которое можно показать пользователю
• Метод для показа сообщения диалогом
• Метод для пока сообщения в виде системного
уведомления
• Предоставляет RemoteAction, который
позволяет запустить процесс восстановления
из любого процесса, напрямую в ваш UI
Cached data
• StorageManager.getCacheQuotaBytes()

Объем памяти доступный для кэшированных данных приложения
• Новая механизм очистки кэша в системе:
• StorageManager.setCacheBehaviorAtomic()

Все файлы в папке удаляются вместе
• StorageManager.setCacheBehaviorTombstone()

Файлы не удалются, но они становятся пустыми
• Выделение дискового пространства для файлов с помощью
StorageManager.allocateBytes()

Автоматически выделит необходимое количество дискового пространства, очистив
кэш если это необходимо
• Используйте StorageManager.getAllocatableBytes() вместо
File.getUsableSpace() для проверки того что на устройстве
достаточно места для хранения новых данных

Будет проверено доступное свободное место, и кэш который система сможет
очистить для вашего приложения
Content Provider
• Новый метод запроса с параметрами выборки &
сортировки в виде Bundle
• Принудительно обновление данных по
заданному URI

refresh(Uri, Bundle, CancelationSignal)
• Пагинация запросов
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);
Content Provider
• Новый метод запроса с параметрами выборки &
сортировки в виде Bundle
• Принудительно обновление данных по
заданному URI

refresh(Uri, Bundle, CancelationSignal)
• Пагинация запросов
• Изменение данных в статистике использования
контактов для всех приложений

Запросы о использование данных теперь возвращают
примерные данные, вместо точных для TIMES_CONTACTED,
TIMES_USED, LAST_TIME_CONTACTED, LAST_TIME_USED
Поддержка нескольких дисплеев
• Улучшенная поддержка нескольких дисплеев
• Можно перемещать Activity между дисплеями
• Когда Activity перемещается между дисплеями,
система изменяет размер Activity и оповещает
об изменение конфигурации, если это
необходимо,
• ActivityOptions содержит новые методы для
управления дисплеем на котором запускается
Activity
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
Strict mode
• ThreadPolicy.Builder.detectUnbufferedIo()

Определяет когда приложение использу IO без буферизации
• VmPolicy.Builder.detectContentUriWithoutPermission()

Определяет когда приложения не предоставляет разрешения
стороннему приложения, когда запуска Activity вне вашего
приложения
• VmPolicy.Builder.detectUntaggedSockets()

Определяет когда ваше приложения использует сетевые.
операции без использования TrafficStats.setThreadStateTag()
для пометки сетевого трафика с целью его отладки
Категоризация приложений
• Используется для объединения приложений с
одинаковыми целями при отображение их
пользователю, например в мониторе
использования данных или расхода батареи
• Необходимо задать атрибут android:appCategory
в тэге <application> манифеста вашего
приложения
Категоризация приложений
• audio
• game
• image
• maps
• news
• productivity
• social
• video
AccountManager API
• Управление видимостью аккаунтов для других
приложений
• Теперь можно слушать изменения аккаунтов только
для заданных типов аккаунтов
• Теперь приложение может получить доступ к
аккаунтам, только если аутентикатор создал этот
аккаунт, либо пользователь дал доступ приложению 

Разрешение GET_ACCOUNTS больше недостаточно. Необходимо
использовать AccountManager.newChooseAccountIntent() для
получения доступа
• LOGIN_ACCOUNTS_CHANGED_ACTIONS

Используйте AccountManager.addOnAccountsUpdatedListener() во
время работы приложения
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);
Изменения Alert Windows
Приложения которые используют разрешение
SYSTEM_ALERT_WINDOW и используют один из
перечисленных типов Alert Window:
• TYPE_PHONE
• TYPE_PRIORITY_PHONE
• TYPE_SYSTEM_ALERT
• TYPE_SYSTEM_OVERLAY
• TYPE_SYSTEM_ERROR
Изменения Alert Windows
• Приложения больше не могут больше
использовать перечисленные типы окон

Используйте новый тип окон - TYPE_APPLICATION_OVERLAY
• Окна с указанными типами будут показаны под
окном с типом TYPE_APPLICATION_OVERLAY
• Изменения касаются только приложений с
targetSdk=O
Другие обновления
• Возвращаемый тип в View.findViewById() и
View.findViewByTag() теперь типизированный

Больше не нужно привидений. Activity.findViewById() не
изменился (
• View Tooltip
Другие обновления
Другие обновления
• Возвращаемый тип в View.findViewById() и
View.findViewByTag() теперь типизированный
• View Tooltip
• AnimatorSet seeking и обратное воспроизведение
• Обновления Android ICU до версии 58
• Settings.Secure.ANDROID_ID уникальное для каждого
приложения и пользователя
• SSLv3 больше не поддерживается
• Приложения, которые устанавливают другие
приложения, должны получить доступ через систему
Другие обновления
• PreferenceManages.setDataStore(PreferenceDataStore)

Позволяет задать свое собственное хранилище для всех данных
в PreferenceManager. Альтернатива SharedPreference
• Build.SERIAL

Используйте Build.getSerial().

Необходимо разрешение READ_PHONE_STATE
• android.app.ProgressDialog
• Режим цвета в конфигурации устройства
• Обновление API Picture-In-Picture
• Улучшения в Storage Access Framework
Новые функции
• Autofill Framework
• Shortcuts & Widget Pinning
• Picture-in-Picture на всех платформах
• Управление цветом
• Wi-Fi Aware
• Companion device pairing
• Обновление Accessibility
• Улучшения медиа фреймворка
• LDAC
Program overview
DP1 - alpha
DP2 - beta (Google I/O 2017?)
DP3 - Final APIs & SDK, Play publishing

DP4 - pre-final images
Больше об Android O на

d.android.com/preview
Спасибо за
внимание!

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

  • 1.
  • 2.
  • 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.
    Каналы уведомлений 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.
    Каналы уведомлений 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 blacktext on black is background is bug of Android O Preview 1
  • 8.
    Свойства каналов • Приоритет •Звук • Управление светодиодом • Вибрация • Отображение на заблокированном экране • Badge в Launcher
  • 9.
    Изменения в NotificationsAPI • Канал обязателен для все Notification • Приоритет Notification не дает эффекта, используйте приоритеты каналов. • NotificationListenerService теперь может понимать кем было удалено уведомление: пользователем или приложением, с помощью нового метода onNotificationRemoved()
  • 10.
    Изменения в Notification.BuilderAPI • Notification.Builder(Context)
 Используйте Notification.Builder(Context, String) • setTimeout()
 Задает время после которого уведомление будет удалено • setColorized()
 Разукрашивать ли фон уведомления в цвет, который задан с помощью метода setColor() • chooseBadgeIcon()
 Тип иконки, который будет использовать как badge для уведомления • setShortcutId()
 Launcher может спрятать Shortcut, который дублирует уведомления. Работает только в случае если Launcher поддерживает Shortcut
  • 11.
  • 12.
    Ограничения Service Foreground Processes VisibleProcesses Service Processes Background Processes Empty Processes
  • 13.
    Ограничения Service Foreground Processes VisibleProcesses Service Processes
 (several minutes) Background Processes Empty Processes
  • 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 приложения
  • 16.
  • 17.
  • 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
  • 20.
  • 21.
  • 22.
    JobScheduler • Условия сети •Состояние зарядки • Находится ли устройство в простое (Idle state) • Время выполнения • Периодичность выполнения • Крайний срок выполнения • Политику повтора выполнения при ошибке • Сохранять ли работы между перезагрузками • Может выполнять работы при изменение контента в ContentProvider • Работает в ограничениях Doze Mode и App Standby
  • 23.
    Другие ограничения фоновыхопераций • Система убирает все Wakelock когда приложение переходит в кэшированное состояние (нет активных компонентов) • Приложение в фоне получается обновление местоположения только несколько раз в час
 * Может быть изменено в следующих DP • Service.startForeground() больше не работает. Используйте NotificationManager.startServiceInForeground()
 Применяется только для приложений с targetSdk=O • Context.startService() теперь бросает исключение IllegalStateExceptions, если приложение попытается использовать этот метод в случае когда Service становится restricted
  • 24.
  • 25.
  • 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.
    Задание шрифтов в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.
  • 29.
  • 30.
    Новые правила дляиконок в launcher • Иконка, которая состоит из 2 слоев: внутреннего и фонового слоев • Оба слоя должны иметь размер 108 × 108 dp • Внутренний слой иконки должен отрисовываться в зоне 72 × 72 dp • Зона вокруг иконки в 36 dp в каждой стороне зарезервирована для визуальных эффектов
  • 31.
  • 32.
    Пример <maskable-icon>     <backgroundandroid:drawable="@color/ic_background"/>     <foreground android:drawable="@mipmap/ic_foreground"/> </maskable-icon>
  • 33.
  • 34.
    Autosizing TextView • Granularity
 Выбираемнаилучший размер текста на основе доступного места в интервале между минимальным и максимальным размером, и размер шага • Preset Sizes
 Выбирается наилучший размер из списка заданных
  • 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.
    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.
  • 38.
    Java 8 DateTime •Отдельный классы для даты и времени • Классы для представления периодов (Period) и интервалов (Duration) • Немодифицируемые • Потокобезопасные *Можно использовать backport Java 8 DateTime - ThreeTenAbp
  • 39.
    Java 7/8 NIOAPI • Path • Stream API для файлов • Работа с информацией о файовой системе • WatchService
  • 40.
    Другие обновления JavaAPI • 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.
  • 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) • Пагинация запросов
  • 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.
    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 • MultiprocessWebView
 Содержимое 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> манифеста вашего приложения
  • 53.
    Категоризация приложений • audio •game • image • maps • news • productivity • social • video
  • 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
  • 59.
  • 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.
    Новые функции • AutofillFramework • 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
  • 64.
    Больше об AndroidO на
 d.android.com/preview
  • 65.