Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

226 views

Published on

Поговорим о новшествах Android Nougat, что нужно добавить и изменить, чтобы пользователи использовали все возможности платформы.

Published in: Mobile
  • Be the first to comment

  • Be the first to like this

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

  1. 1. Держи свое приложение на волне новинок Денис Неклюдов Google Developer Expert Ведущий подкаста Android Dev Разработчик в
  2. 2. А там что-то изменилось?
  3. 3. Изменения в DozeMode
  4. 4. Project Svelte - больше ограничений API < 24 API ≥ 24 Manifest API ≥ 24 Runtime CONNECTIVITY_ACTION разрешен запрещен разрешен ACTION_NEW_PICTURE ACTION_NEW_VIDEO запрещен запрещен запрещен
  5. 5. Экономим трафик пользователя Data Saver Mode – ограничение фонового потока данных и не только. ConnectivityManager.getRestrictBackgroundStatus(): RESTRICT_BACKGROUND_STATUS_DISABLED RESTRICT_BACKGROUND_STATUS_ENABLED - нужно максимально снизить использование данных сети. Фоновые запросы к сети могут быть запрещены. RESTRICT_BACKGROUND_STATUS_WHITELISTED ConnectivityManager.isActiveNetworkMetered(): - ограничиваем использование сети и в этом случае.
  6. 6. Multi-window
  7. 7. Для быстрой отрисовки графики Поддержка Vulkan API OpenGL™ ES 3.2 API Улучшения SurfaceView
  8. 8. Multi-window Все Activity, кроме той, с которой пользователь только что взаимодействовал находятся в состоянии paused: - не останавливайте воспроизведение по onPause() android:resizeableActivity = "true" – меняет размер всех activity в стеке resizeableActivity – для API ≥ 24 по-умолчанию true - Fullscreen запрещен - изменения атрибута screenOrientation игнорируются
  9. 9. Multi-window <activity android:name=".MyActivity"> <layout android:defaultHeight="500dp" android:defaultWidth="600dp" android:gravity="top|end" android:minHeight="450dp" android:minWidth="300dp" /> </activity>
  10. 10. Multi-window Узнаем о многооконном режиме: - isInMultiWindowMode() - onMultiWindowModeChanged() Не забываем про поддержку drag and drop!
  11. 11. Ответ в уведомлениях 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))
  12. 12. Отслеживание ответа в уведомлениях Activity, определенная в PendingIntent ловит событие и обрабатывает его. Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); private CharSequence getMessageText(Intent intent) { Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); return remoteInput.getCharSequence(KEY_TEXT_REPLY); } Чтобы убрать прогресс в уведомлении, нужно удалить текущее уведомление или обновить его.
  13. 13. Чат в уведомлениях 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();
  14. 14. Группировка уведомлений 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)
  15. 15. Quick Tile API Для добавления своего значка быстрого доступа: Создаем свой сервис наследник от TileService. Можем запускать Runnable и отправлять Intent. Можем менять иконку и текст. Не можем раскрывать настройку на полный экран. https://medium.com/@KieronQuinn/quick-settings-in-android-n-ea8ad8ce2eea
  16. 16. Шире возможности работы с телефоном Добавлен черный список абонентов. android.provider.BlockedNumberContract Появилась возможность дефолтному приложению для звонков: Сбрасывать входящие Удалять звонок из истории Скрывать уведомление о входящем звонке android.telecom.CallScreeningService
  17. 17. Изменилась стратегия поиска подходящей строки: 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) Улучшения локализации
  18. 18. Больше улучшений ввода Встроенный ICU4J (нет поддержки ICU4C) Новые эмодзи и расширенная их поддержка было: стало:
  19. 19. WebView Если установлен Chrome - будет использоваться он вместо WebView. Можно запустить в отдельном процессе. Теперь контекст JavaScript будет сброшен при загрузке новой странице Доступ к геолокации только при HTTPS соединении Доступ к новым бетам WebView
  20. 20. Android TV Запись телепередач вашего приложения через TV recording API. Возможность показывать “картинку-в-картинке”.
  21. 21. 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() - для миграции
  22. 22. Улучшения в безопасности 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
  23. 23. 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()); }
  24. 24. Ближе к десктопам Keyboard Shortcuts Helper для отображения всех хоткеев приложения Custom Pointer API для изменения иконки курсора
  25. 25. Важно также иметь ввиду Sustained Performance API – запрос на долгую нагруженную фоновую работу Улучшения в Print Service – больше возможности для кастомизации FrameMetricsListener API – измеряем производительность на продакшен- сборках Virtual Files – доступ к облачным файлам, как к обычным
  26. 26. Не API, но нужно знать
  27. 27. Рантайм на три буквы ART имеет теперь не только Ahead of Time, но и Just in Time компиляцию. По заверениям разработчиков это повышает качество оптимизаций, сокращая использование RAM и ускоряя работу приложения. Также это избавляет от шага оптимизации при обновлении системы.
  28. 28. Динамическое изменение DPI Теперь пользователь может изменить плотность DPI без рута и перезагрузки.
  29. 29. Больше никакой линковки к нативным либам обращения к приватным нативным библиотекам API < 24 API = 24 API > 24 NDK Public разрешен разрешен разрешен NDK Private не удаленные тост и лог с предупреждением тост и лог с предупреждением ошибка NDK Private удаленные ошибка ошибка ошибка
  30. 30. Спасибо за внимание! Денис Неклюдов Подкаст: apptractor.ru/androidDev telegram: @nekdenis nekdenis@gmail.com

×