31
Держи свое приложение на волне новинок Денис Неклюдов Google Developer Expert Ведущий подкаста Android Dev Разработчик в

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

  • Upload
    -

  • View
    110

  • Download
    9

Embed Size (px)

Citation preview

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

Держи свое приложение на волне новинок

Денис НеклюдовGoogle Developer Expert

Ведущий подкаста Android DevРазработчик в

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

А там что-то изменилось?

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

Изменения в DozeMode

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

Экономим трафик пользователя

Data Saver Mode – ограничение фонового потока данных и не только.

ConnectivityManager.getRestrictBackgroundStatus():

RESTRICT_BACKGROUND_STATUS_DISABLED

RESTRICT_BACKGROUND_STATUS_ENABLED - нужно максимально снизить использование данных сети. Фоновые запросы к сети могут быть запрещены.

RESTRICT_BACKGROUND_STATUS_WHITELISTED

ConnectivityManager.isActiveNetworkMetered(): - ограничиваем использование сети и в этом случае.

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

Multi-window

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

Для быстрой отрисовки графики

Поддержка Vulkan API

OpenGL™ ES 3.2 API

Улучшения SurfaceView

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

Multi-window

Все Activity, кроме той, с которой пользователь только что взаимодействовал находятся в состоянии paused:- не останавливайте воспроизведение по onPause()

android:resizeableActivity = "true" – меняет размер всех activity в стеке

resizeableActivity – для API ≥ 24 по-умолчанию true

- Fullscreen запрещен

- изменения атрибута screenOrientation игнорируются

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

Multi-window

<activity android:name=".MyActivity">

<layout android:defaultHeight="500dp"

android:defaultWidth="600dp"

android:gravity="top|end"

android:minHeight="450dp"

android:minWidth="300dp" />

</activity>

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

Multi-window

Узнаем о многооконном режиме:

- isInMultiWindowMode()

- onMultiWindowModeChanged()

Не забываем про поддержку drag and drop!

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

Ответ в уведомлениях

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))

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

Отслеживание ответа в уведомлениях

Activity, определенная в PendingIntent ловит событие и обрабатывает его.

Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);

private CharSequence getMessageText(Intent intent) {

Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);

return remoteInput.getCharSequence(KEY_TEXT_REPLY);

}

Чтобы убрать прогресс в уведомлении, нужно удалить текущее уведомление или обновить его.

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

Чат в уведомлениях

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();

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

Группировка уведомлений

NotificationCompat.Builder(mContext)

.setStyle(new NotificationCompat.InboxStyle()

.addLine("Alex Faaborg Check this out")

.addLine("Jeff Chang Launch Party")

.setBigContentTitle("2 new messages")

.setSummaryText("[email protected]"))

.setGroup(GROUP_KEY_EMAILS)

.setGroupSummary(true)

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

Quick Tile API

Для добавления своего значка быстрого доступа:

Создаем свой сервис наследник от TileService.

Можем запускать Runnable и отправлять Intent.

Можем менять иконку и текст.

Не можем раскрывать настройку на полный экран.

https://medium.com/@KieronQuinn/quick-settings-in-android-n-ea8ad8ce2eea

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

Шире возможности работы с телефоном

Добавлен черный список абонентов. android.provider.BlockedNumberContract

Появилась возможность дефолтному приложению для звонков:

Сбрасывать входящие

Удалять звонок из истории

Скрывать уведомление о входящем звонке

android.telecom.CallScreeningService

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

Изменилась стратегия поиска подходящей строки:

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)

Улучшения локализации

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

Больше улучшений ввода

Встроенный ICU4J (нет поддержки ICU4C)

Новые эмодзи и расширенная их поддержка

было:

стало:

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

WebView

Если установлен Chrome - будет использоваться он вместо WebView.

Можно запустить в отдельном процессе.

Теперь контекст JavaScript будет сброшен при загрузке новой странице

Доступ к геолокации только при HTTPS соединении

Доступ к новым бетам WebView

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

Android TV

Запись телепередач вашего приложения через TV recording API.

Возможность показывать “картинку-в-картинке”.

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

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() - для

миграции

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

Улучшения в безопасности

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

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

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());}

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

Ближе к десктопам

Keyboard Shortcuts Helper для отображения всех хоткеев приложения

Custom Pointer API для изменения иконки курсора

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

Важно также иметь ввиду

Sustained Performance API – запрос на долгую нагруженную фоновую работу

Улучшения в Print Service – больше возможности для кастомизации

FrameMetricsListener API – измеряем производительность на продакшен-сборках

Virtual Files – доступ к облачным файлам, как к обычным

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

Не API, но нужно знать

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

Рантайм на три буквы

ART имеет теперь не только Ahead of Time, но и Just in Time компиляцию.

По заверениям разработчиков это повышает качество оптимизаций, сокращая использование RAM и ускоряя работу приложения.

Также это избавляет от шага оптимизации при обновлении системы.

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

Динамическое изменение DPI

Теперь пользователь может изменить плотность DPI без рута и перезагрузки.

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

Больше никакой линковки к нативным либам

обращения к приватным нативным библиотекам API < 24 API = 24 API > 24

NDK Public разрешен разрешен разрешен

NDK Private

не удаленные

тост и лог с предупреждением

тост и лог с предупреждением

ошибка

NDK Private

удаленные

ошибка ошибка ошибка

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

Спасибо за внимание!Денис Неклюдов

Подкаст: apptractor.ru/androidDev

telegram: @[email protected]