Upload
-
View
110
Download
9
Embed Size (px)
Citation preview
Держи свое приложение на волне новинок
Денис Неклюдов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("[email protected]"))
.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
удаленные
ошибка ошибка ошибка