Держи свое приложение
на волне новинок
Денис Неклюдов
Google Developer Expert
Ведущий подкаста Android Dev
Разработчик в
А там что-то изменилось?
Изменения в DozeMode
Project Svelte - больше ограничений
API < 24 API ≥ 24
Manifest
API ≥ 24
Runtime
CONNECTIVITY_ACTION разрешен запрещен разрешен
ACTION_NEW_PICTURE
ACTION_NEW_VIDEO
запрещен запрещен запрещен
Экономим трафик пользователя
Data Saver Mode – ограничение фонового потока данных и не только.
ConnectivityManager.getRestrictBackgroundStatus():
RESTRICT_BACKGROUND_STATUS_DISABLED
RESTRICT_BACKGROUND_STATUS_ENABLED - нужно максимально снизить
использование данных сети. Фоновые запросы к сети могут быть
запрещены.
RESTRICT_BACKGROUND_STATUS_WHITELISTED
ConnectivityManager.isActiveNetworkMetered(): - ограничиваем использование
сети и в этом случае.
Multi-window
Для быстрой отрисовки графики
Поддержка Vulkan API
OpenGL™ ES 3.2 API
Улучшения SurfaceView
Multi-window
Все Activity, кроме той, с которой пользователь только что взаимодействовал
находятся в состоянии paused:
- не останавливайте воспроизведение по onPause()
android:resizeableActivity = "true" – меняет размер всех activity в стеке
resizeableActivity – для API ≥ 24 по-умолчанию true
- Fullscreen запрещен
- изменения атрибута screenOrientation игнорируются
Multi-window
<activity android:name=".MyActivity">
<layout android:defaultHeight="500dp"
android:defaultWidth="600dp"
android:gravity="top|end"
android:minHeight="450dp"
android:minWidth="300dp" />
</activity>
Multi-window
Узнаем о многооконном режиме:
- isInMultiWindowMode()
- onMultiWindowModeChanged()
Не забываем про поддержку drag and drop!
Ответ в уведомлениях
RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
.setLabel(“Ответить”)
.build();
Notification.Action.Builder(R.drawable.ic_reply_icon,
getString(R.string.label), replyPendingIntent)
.addRemoteInput(remoteInput)
Notification.Builder(mContext)
.addAction(action))
Отслеживание ответа в уведомлениях
Activity, определенная в PendingIntent ловит событие и обрабатывает его.
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
private CharSequence getMessageText(Intent intent) {
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
return remoteInput.getCharSequence(KEY_TEXT_REPLY);
}
Чтобы убрать прогресс в уведомлении, нужно удалить текущее уведомление
или обновить его.
Чат в уведомлениях
Notification notification = new Notification.Builder()
.setStyle(new Notification.MessagingStyle("Me")
.setConversationTitle("Team lunch")
.addMessage("Hi", timestamp1, null)
.addMessage("Not much", timestamp3, null)
.addMessage("How about lunch?", timestamp4, "Coworker"))
.build();
Группировка уведомлений
NotificationCompat.Builder(mContext)
.setStyle(new NotificationCompat.InboxStyle()
.addLine("Alex Faaborg Check this out")
.addLine("Jeff Chang Launch Party")
.setBigContentTitle("2 new messages")
.setSummaryText("johndoe@gmail.com"))
.setGroup(GROUP_KEY_EMAILS)
.setGroupSummary(true)
Quick Tile API
Для добавления своего значка быстрого доступа:
Создаем свой сервис наследник от TileService.
Можем запускать Runnable и отправлять Intent.
Можем менять иконку и текст.
Не можем раскрывать настройку на полный экран.
https://medium.com/@KieronQuinn/quick-settings-in-android-n-ea8ad8ce2eea
Шире возможности работы с телефоном
Добавлен черный список абонентов.
android.provider.BlockedNumberContract
Появилась возможность дефолтному приложению для звонков:
Сбрасывать входящие
Удалять звонок из истории
Скрывать уведомление о входящем звонке
android.telecom.CallScreeningService
Изменилась стратегия поиска подходящей строки:
Try fr_CH => Fail. Try fr => Fail. Try children of fr => fr_FR. Use fr_FR
Добавилась вторая дефолтная локаль пользователя
(LocaleList.getDefault()):
Try fr_CH => Fail. Try fr => Fail. Try children of fr => Fail.
Try it_CH => Fail. Try it => Fail. Try children of it => it_IT. Use it_IT
Улучшены форматтеры текста:
format(locale, "Choose a %d-digit PIN", 4)
Улучшения локализации
Больше улучшений ввода
Встроенный ICU4J (нет поддержки ICU4C)
Новые эмодзи и расширенная их поддержка
было:
стало:
WebView
Если установлен Chrome - будет использоваться он вместо WebView.
Можно запустить в отдельном процессе.
Теперь контекст JavaScript будет сброшен при загрузке новой странице
Доступ к геолокации только при HTTPS соединении
Доступ к новым бетам WebView
Android TV
Запись телепередач вашего приложения через TV recording API.
Возможность показывать “картинку-в-картинке”.
Direct Boot
Чтобы приложение могло работать до первой разблокировки устройства, на
котором включено шифрование:
<receiver
android:directBootAware="true" >
<intent-filter>
<action android:name="android.intent.action.ACTION_LOCKED_BOOT_COMPLETED" />
appContext.createDeviceProtectedStorageContext() - для доступа к ресурсам, SP и БД
directBootContext.openFileInput(appDataFilename) - для доступа к файлам
Context.moveSharedPreferencesFrom() и Context.moveDatabaseFrom() - для миграции
Улучшения в безопасности
Key Attestation
Network Security Config
Default Trusted Certificate Authority
Debug-only overrides
Cleartext traffic opt-out
Certificate pinning
APK Signature Scheme v2
Scoped Directory Access
Scoped Directory Access
StorageManager sm = (StorageManager)getSystemService(Context.STORAGE_SERVICE);
StorageVolume volume = sm.getPrimaryStorageVolume();
Intent intent = volume.createAccessIntent(Environment.DIRECTORY_PICTURES);
startActivityForResult(intent, request_code);
if (requestCode == OPEN_DIRECTORY_REQUEST_CODE
&& resultCode == Activity.RESULT_OK) {
getContentResolver().takePersistableUriPermission(data.getData(),
Intent.FLAG_GRANT_READ_URI_PERMISSION |
Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
updateDirectoryEntries(data.getData());
}
Ближе к десктопам
Keyboard Shortcuts Helper для
отображения всех хоткеев приложения
Custom Pointer API для изменения иконки
курсора
Важно также иметь ввиду
Sustained Performance API – запрос на долгую нагруженную фоновую
работу
Улучшения в Print Service – больше возможности для кастомизации
FrameMetricsListener API – измеряем производительность на продакшен-
сборках
Virtual Files – доступ к облачным файлам, как к обычным
Не API, но нужно знать
Рантайм на три буквы
ART имеет теперь не только Ahead of Time, но и Just in Time компиляцию.
По заверениям разработчиков это повышает качество оптимизаций,
сокращая использование RAM и ускоряя работу приложения.
Также это избавляет от шага оптимизации при обновлении системы.
Динамическое изменение DPI
Теперь пользователь может изменить плотность DPI без рута и
перезагрузки.
Больше никакой линковки к нативным либам
обращения к приватным
нативным библиотекам API < 24 API = 24 API > 24
NDK Public разрешен разрешен разрешен
NDK Private
не удаленные
тост и лог с
предупреждением
тост и лог с
предупреждением
ошибка
NDK Private
удаленные
ошибка ошибка ошибка
Спасибо за внимание!
Денис Неклюдов
Подкаст: apptractor.ru/androidDev
telegram: @nekdenis
nekdenis@gmail.com

Денис Неклюдов. Держи свое приложение на волне новинок. РИФ-Воронеж 2016

  • 1.
    Держи свое приложение наволне новинок Денис Неклюдов Google Developer Expert Ведущий подкаста Android Dev Разработчик в
  • 3.
    А там что-тоизменилось?
  • 4.
  • 5.
    Project Svelte -больше ограничений API < 24 API ≥ 24 Manifest API ≥ 24 Runtime CONNECTIVITY_ACTION разрешен запрещен разрешен ACTION_NEW_PICTURE ACTION_NEW_VIDEO запрещен запрещен запрещен
  • 6.
    Экономим трафик пользователя DataSaver Mode – ограничение фонового потока данных и не только. ConnectivityManager.getRestrictBackgroundStatus(): RESTRICT_BACKGROUND_STATUS_DISABLED RESTRICT_BACKGROUND_STATUS_ENABLED - нужно максимально снизить использование данных сети. Фоновые запросы к сети могут быть запрещены. RESTRICT_BACKGROUND_STATUS_WHITELISTED ConnectivityManager.isActiveNetworkMetered(): - ограничиваем использование сети и в этом случае.
  • 7.
  • 8.
    Для быстрой отрисовкиграфики Поддержка Vulkan API OpenGL™ ES 3.2 API Улучшения SurfaceView
  • 9.
    Multi-window Все Activity, крометой, с которой пользователь только что взаимодействовал находятся в состоянии paused: - не останавливайте воспроизведение по onPause() android:resizeableActivity = "true" – меняет размер всех activity в стеке resizeableActivity – для API ≥ 24 по-умолчанию true - Fullscreen запрещен - изменения атрибута screenOrientation игнорируются
  • 10.
  • 11.
    Multi-window Узнаем о многооконномрежиме: - isInMultiWindowMode() - onMultiWindowModeChanged() Не забываем про поддержку drag and drop!
  • 12.
    Ответ в уведомлениях RemoteInputremoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY) .setLabel(“Ответить”) .build(); Notification.Action.Builder(R.drawable.ic_reply_icon, getString(R.string.label), replyPendingIntent) .addRemoteInput(remoteInput) Notification.Builder(mContext) .addAction(action))
  • 13.
    Отслеживание ответа вуведомлениях Activity, определенная в PendingIntent ловит событие и обрабатывает его. Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); private CharSequence getMessageText(Intent intent) { Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); return remoteInput.getCharSequence(KEY_TEXT_REPLY); } Чтобы убрать прогресс в уведомлении, нужно удалить текущее уведомление или обновить его.
  • 14.
    Чат в уведомлениях Notificationnotification = new Notification.Builder() .setStyle(new Notification.MessagingStyle("Me") .setConversationTitle("Team lunch") .addMessage("Hi", timestamp1, null) .addMessage("Not much", timestamp3, null) .addMessage("How about lunch?", timestamp4, "Coworker")) .build();
  • 15.
    Группировка уведомлений NotificationCompat.Builder(mContext) .setStyle(new NotificationCompat.InboxStyle() .addLine("AlexFaaborg Check this out") .addLine("Jeff Chang Launch Party") .setBigContentTitle("2 new messages") .setSummaryText("johndoe@gmail.com")) .setGroup(GROUP_KEY_EMAILS) .setGroupSummary(true)
  • 16.
    Quick Tile API Длядобавления своего значка быстрого доступа: Создаем свой сервис наследник от TileService. Можем запускать Runnable и отправлять Intent. Можем менять иконку и текст. Не можем раскрывать настройку на полный экран. https://medium.com/@KieronQuinn/quick-settings-in-android-n-ea8ad8ce2eea
  • 17.
    Шире возможности работыс телефоном Добавлен черный список абонентов. android.provider.BlockedNumberContract Появилась возможность дефолтному приложению для звонков: Сбрасывать входящие Удалять звонок из истории Скрывать уведомление о входящем звонке android.telecom.CallScreeningService
  • 18.
    Изменилась стратегия поискаподходящей строки: Try fr_CH => Fail. Try fr => Fail. Try children of fr => fr_FR. Use fr_FR Добавилась вторая дефолтная локаль пользователя (LocaleList.getDefault()): Try fr_CH => Fail. Try fr => Fail. Try children of fr => Fail. Try it_CH => Fail. Try it => Fail. Try children of it => it_IT. Use it_IT Улучшены форматтеры текста: format(locale, "Choose a %d-digit PIN", 4) Улучшения локализации
  • 19.
    Больше улучшений ввода ВстроенныйICU4J (нет поддержки ICU4C) Новые эмодзи и расширенная их поддержка было: стало:
  • 20.
    WebView Если установлен Chrome- будет использоваться он вместо WebView. Можно запустить в отдельном процессе. Теперь контекст JavaScript будет сброшен при загрузке новой странице Доступ к геолокации только при HTTPS соединении Доступ к новым бетам WebView
  • 21.
    Android TV Запись телепередачвашего приложения через TV recording API. Возможность показывать “картинку-в-картинке”.
  • 22.
    Direct Boot Чтобы приложениемогло работать до первой разблокировки устройства, на котором включено шифрование: <receiver android:directBootAware="true" > <intent-filter> <action android:name="android.intent.action.ACTION_LOCKED_BOOT_COMPLETED" /> appContext.createDeviceProtectedStorageContext() - для доступа к ресурсам, SP и БД directBootContext.openFileInput(appDataFilename) - для доступа к файлам Context.moveSharedPreferencesFrom() и Context.moveDatabaseFrom() - для миграции
  • 23.
    Улучшения в безопасности KeyAttestation Network Security Config Default Trusted Certificate Authority Debug-only overrides Cleartext traffic opt-out Certificate pinning APK Signature Scheme v2 Scoped Directory Access
  • 24.
    Scoped Directory Access StorageManagersm = (StorageManager)getSystemService(Context.STORAGE_SERVICE); StorageVolume volume = sm.getPrimaryStorageVolume(); Intent intent = volume.createAccessIntent(Environment.DIRECTORY_PICTURES); startActivityForResult(intent, request_code); if (requestCode == OPEN_DIRECTORY_REQUEST_CODE && resultCode == Activity.RESULT_OK) { getContentResolver().takePersistableUriPermission(data.getData(), Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); updateDirectoryEntries(data.getData()); }
  • 25.
    Ближе к десктопам KeyboardShortcuts Helper для отображения всех хоткеев приложения Custom Pointer API для изменения иконки курсора
  • 26.
    Важно также иметьввиду Sustained Performance API – запрос на долгую нагруженную фоновую работу Улучшения в Print Service – больше возможности для кастомизации FrameMetricsListener API – измеряем производительность на продакшен- сборках Virtual Files – доступ к облачным файлам, как к обычным
  • 27.
    Не API, нонужно знать
  • 28.
    Рантайм на трибуквы ART имеет теперь не только Ahead of Time, но и Just in Time компиляцию. По заверениям разработчиков это повышает качество оптимизаций, сокращая использование RAM и ускоряя работу приложения. Также это избавляет от шага оптимизации при обновлении системы.
  • 29.
    Динамическое изменение DPI Теперьпользователь может изменить плотность DPI без рута и перезагрузки.
  • 30.
    Больше никакой линковкик нативным либам обращения к приватным нативным библиотекам API < 24 API = 24 API > 24 NDK Public разрешен разрешен разрешен NDK Private не удаленные тост и лог с предупреждением тост и лог с предупреждением ошибка NDK Private удаленные ошибка ошибка ошибка
  • 31.
    Спасибо за внимание! ДенисНеклюдов Подкаст: apptractor.ru/androidDev telegram: @nekdenis nekdenis@gmail.com