Уровень API: 21
Android 5.0 (LOLLIPOP) предлагает новые функции для пользователей и разработчиков приложений. В этом документе рассказывается о наиболее значимых новых API.
Если ваше приложение опубликовано, ознакомьтесь с изменениями в поведении Android 5.0, которые необходимо учесть. Эти изменения могут повлиять на работу приложения на устройствах с Android 5.0, даже если вы не используете новые API или не добавляете новые функции.
Обзор новых функций платформы можно найти в статье Основные возможности Android Lollipop.
Сайт для разработчиков
Чтобы начать создавать приложения для Android 5.0, сначала получите Android SDK. Затем с помощью SDK Manager скачайте платформу SDK и образы системы Android 5.0.
Как обновить целевой уровень API
Чтобы оптимизировать приложение для устройств с Android 5.0, задайте для параметра targetSdkVersion значение "21", установите приложение на образ системы Android 5.0, протестируйте его и опубликуйте обновленную версию с этим изменением.
Вы можете использовать API Android 5.0, поддерживая более ранние версии, добавив в код условия, которые проверяют уровень API перед выполнением API, не поддерживаемых minSdkVersion.
Подробнее о том, как поддерживать обратную совместимость…
Подробнее о том, что такое уровень API…
Важные изменения в поведении
Если вы уже публиковали приложение для Android, учтите, что изменения в Android 5.0 могут повлиять на него.
Подробную информацию можно найти в разделе Изменения в Android 5.0.
Пользовательский интерфейс
Поддержка Material Design
В Android 5.0 добавлена поддержка нового стиля Material Design. Вы можете создавать приложения с материальным дизайном, которые выглядят динамично и имеют переходы между элементами интерфейса, воспринимаемые пользователями как естественные. Поддержка включает:
- тему Material;
- Посмотреть тени
- Виджет
RecyclerView - Анимация Drawable и эффекты стилизации
- Анимация Material Design и эффекты перехода между экранами
- Аниматоры для свойств представления на основе состояния представления
- Настраиваемые виджеты интерфейса и панели приложений с цветовыми палитрами, которые вы можете контролировать.
- Анимированные и неанимированные объекты на основе векторной графики XML
Чтобы узнать больше о том, как добавить в приложение функции Material Design, ознакомьтесь с руководством по внедрению Material Design.
Одновременное открытие документов и выполнение действий на экране недавних файлов
В предыдущих версиях на экране недавних действий можно было посмотреть только одну задачу для каждого приложения, с которым пользователь взаимодействовал недавно. Теперь приложение может открывать больше задач, необходимых для одновременной работы с документами. Эта функция позволяет быстро переключаться между действиями и документами на экране недавних действий, обеспечивая единообразный интерфейс во всех приложениях.
Примерами таких параллельных задач могут быть открытые вкладки в браузере, документы в приложении для эффективной работы, одновременно запущенные матчи в игре или чаты в мессенджере. Ваше приложение может управлять своими задачами с помощью класса ActivityManager.AppTask.
Чтобы вставить логический разрыв, благодаря которому система будет воспринимать ваши действия как новую задачу, используйте FLAG_ACTIVITY_NEW_DOCUMENT при запуске действия с помощью startActivity(). Такое поведение можно задать, установив для атрибута documentLaunchMode элемента <activity> значение "intoExisting" или "always" в манифесте.
Чтобы не перегружать экран последних действий, вы можете задать максимальное количество задач из вашего приложения, которые могут на нем показываться. Для этого задайте атрибут <application> android:maxRecents. В настоящее время можно указать не более 50 задач на пользователя (25 для устройств с небольшим объемом ОЗУ).
Задачи на экране последних действий можно настроить так, чтобы они сохранялись после перезагрузки. Чтобы управлять поведением при сохранении, используйте атрибут android:persistableMode. Вы также можете изменить визуальные свойства действия на экране недавних действий, например цвет, ярлык и значок, вызвав метод setTaskDescription().
Обновления WebView
В Android 5.0 реализация WebView
обновлена до Chromium M37, что позволило повысить безопасность и стабильность, а также исправить ошибки. Строка агента пользователя по умолчанию для WebView, работающего на Android 5.0, была обновлена и теперь содержит номер версии 37.0.0.0.
В этом выпуске представлен класс PermissionRequest, который позволяет приложению предоставлять разрешение WebView на доступ к защищенным ресурсам, таким как камера и микрофон, через веб-API, например getUserMedia(). Чтобы предоставить разрешения для WebView, приложению необходимы соответствующие разрешения Android для этих ресурсов.
С помощью нового метода onShowFileChooser()
теперь можно использовать поле формы ввода в WebView
и запустить выбор файлов, чтобы выбрать изображения и файлы с устройства Android.
Кроме того, в этом выпуске добавлена поддержка открытых стандартов WebAudio, WebGL и WebRTC. Чтобы узнать больше о новых функциях, добавленных в этом выпуске, ознакомьтесь с информацией о WebView для Android.
Запись экрана и демонстрация экрана
В Android 5.0 добавлены новые API android.media.projection, которые позволяют добавить в приложение функции записи и демонстрации экрана. Эта функция может быть полезна, например, если вы хотите включить демонстрацию экрана в приложении для видеоконференций.
Новый метод createVirtualDisplay() позволяет приложению захватывать содержимое основного экрана (дисплея по умолчанию) в объект Surface, который затем можно передать по сети. API позволяет записывать только незащищенный контент экрана, но не системный звук. Чтобы начать запись экрана, ваше приложение должно сначала запросить разрешение пользователя, запустив диалоговое окно записи экрана с помощью Intent, полученного через метод createScreenCaptureIntent().
Пример использования новых API можно найти в MediaProjectionDemoклассе в проекте с образцами кода.
Уведомления
Уведомления на заблокированном экране
На заблокированном экране Android 5.0 можно показывать уведомления. В настройках можно разрешить или запретить показ конфиденциальных данных в уведомлениях на заблокированном экране.
Приложение может контролировать уровень детализации, который будет виден, когда его уведомления показываются на заблокированном экране. Чтобы настроить уровень видимости, вызовите функцию setVisibility() и укажите одно из следующих значений:
VISIBILITY_PRIVATE: Показывает основную информацию, например значок уведомления, но скрывает его полный контент.VISIBILITY_PUBLIC: Показывает полный текст уведомления.VISIBILITY_SECRET: Не показывать ничего, даже значок уведомления.
Если уровень видимости – VISIBILITY_PRIVATE, вы также можете предоставить отредактированную версию уведомления, в которой скрыты личные данные. Например, приложение для обмена SMS-сообщениями может показывать уведомление "У вас 3 новых текстовых сообщения", но скрывать их содержимое и отправителей. Чтобы создать альтернативное уведомление, сначала создайте заменяющее уведомление с помощью Notification.Builder. При создании объекта частного уведомления прикрепите к нему уведомление для замены с помощью метода setPublicVersion().
Метаданные уведомлений
В Android 5.0 для более эффективной сортировки уведомлений используются метаданные, связанные с ними. Чтобы задать метаданные, вызовите следующие методы в Notification.Builder при создании уведомления:
setCategory()– указывает системе, как обрабатывать уведомления от приложения, когда устройство находится в режиме приоритета (например, если уведомление относится к входящему вызову, мгновенному сообщению или будильнику).setPriority(): Позволяет отметить уведомление как более или менее важное, чем обычные уведомления. Уведомления, в которых для поля "Приоритет" задано значениеPRIORITY_MAXилиPRIORITY_HIGH, появляются в небольшом плавающем окне, если уведомление также сопровождается звуком или вибрацией.addPerson()– позволяет добавить одного или нескольких пользователей, которые имеют отношение к уведомлению. Приложение может использовать этот параметр, чтобы указать системе, что уведомления от определенных людей нужно группировать или считать более важными.
Графика
Поддержка OpenGL ES 3.1
В Android 5.0 добавлены интерфейсы Java и нативная поддержка OpenGL ES 3.1. Основные новые функции OpenGL ES 3.1:
- Шейдеры вычислений
- Отдельные объекты шейдеров
- Команды непрямой отрисовки
- Текстуры с многократной выборкой и трафаретом
- Улучшения языка затенения
- Расширения для продвинутых режимов наложения и отладки
- Обратная совместимость с OpenGL ES 2.0 и 3.0
Интерфейс Java для OpenGL ES 3.1 на Android предоставляется вместе с
GLES31. При использовании OpenGL ES 3.1 обязательно укажите его в файле манифеста с помощью тега <uses-feature> и атрибута android:glEsVersion. Пример:
<manifest>
<uses-feature android:glEsVersion="0x00030001" />
...
</manifest>Подробнее о том, как использовать OpenGL ES, в том числе как проверить поддерживаемую версию OpenGL ES во время выполнения, рассказывается в руководстве по API OpenGL ES.
Android Extension Pack
В дополнение к OpenGL ES 3.1 в этом выпуске предлагается пакет расширений с интерфейсами Java и встроенной поддержкой расширенных функций графики. Android рассматривает эти расширения как единый пакет. (Если расширение ANDROID_extension_pack_es31a присутствует, приложение может считать, что все расширения в пакете присутствуют, и включить функции языка затенения с помощью одного оператора #extension.)
Пакет расширений поддерживает:
- Гарантированная поддержка фрагментного шейдера для буферов хранения шейдеров, изображений и атомарных операций (поддержка фрагментного шейдера в OpenGL ES 3.1 необязательна).
- Тесселяция и геометрические шейдеры
- Формат сжатия текстур ASTC (LDR)
- Интерполяция и затенение на уровне образца
- Разные режимы наложения для каждого цветового буфера кадра
Интерфейс Java для пакета расширений предоставляется вместе с GLES31Ext. В манифесте приложения можно указать, что оно должно устанавливаться только на устройствах, поддерживающих пакет расширения.
Пример:
<manifest>
<uses-feature android:name=“android.hardware.opengles.aep”
android:required="true" />
...
</manifest>Мультимедиа
Camera API для расширенных возможностей камеры
В Android 5.0 представлен новый API android.hardware.camera2, который позволяет более точно управлять съемкой и обработкой изображений. Теперь вы можете программно получать доступ к устройствам камеры, доступным системе, с помощью getCameraIdList() и подключаться к определенному устройству с помощью openCamera().
Чтобы начать съемку, создайте CameraCaptureSession и укажите объекты Surface, которым будут отправляться полученные изображения.
CameraCaptureSession можно настроить так, чтобы делать один снимок или несколько снимков подряд.
Чтобы получать уведомления о новых изображениях, реализуйте прослушиватель CameraCaptureSession.CaptureCallback и задайте его в запросе на съемку. Теперь, когда система выполняет запрос на получение изображения, ваш слушатель CameraCaptureSession.CaptureCallback получает вызов onCaptureCompleted(), предоставляя вам метаданные захвата изображения в CaptureResult.
Класс CameraCharacteristics позволяет приложению определять, какие функции камеры доступны на устройстве. Свойство INFO_SUPPORTED_HARDWARE_LEVEL объекта представляет уровень функциональности камеры.
- Все устройства поддерживают как минимум уровень аппаратного обеспечения
INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY, возможности которого примерно соответствуют возможностям устаревшего APICamera. - Устройства, поддерживающие уровень оборудования
INFO_SUPPORTED_HARDWARE_LEVEL_FULL, позволяют вручную управлять съемкой и постобработкой, а также снимать изображения с высоким разрешением при высокой частоте кадров.
Чтобы узнать, как использовать обновленный Camera API, ознакомьтесь с примерами реализации Camera2Basic и Camera2Video в этом выпуске.
Воспроизведение аудио
В этой версии AudioTrack внесены следующие изменения:
- Теперь ваше приложение может передавать аудиоданные в формате с плавающей запятой (
ENCODING_PCM_FLOAT). Это позволяет увеличить динамический диапазон, повысить точность и запас по уровню. Арифметика с плавающей запятой особенно полезна при промежуточных вычислениях. Конечные точки воспроизведения используют целочисленный формат для аудиоданных и меньшую разрядность. (В Android 5.0 некоторые части внутреннего конвейера ещё не поддерживают числа с плавающей запятой.) - Теперь ваше приложение может предоставлять аудиоданные в виде
ByteBufferв том же формате, что иMediaCodec. - Параметр
WRITE_NON_BLOCKINGможет упростить буферизацию и многопоточность для некоторых приложений.
Управление воспроизведением мультимедиа
Используйте новые API для уведомлений и медиаконтента, чтобы системный интерфейс знал о воспроизведении медиаконтента и мог извлекать и показывать обложки альбомов.
Управлять воспроизведением медиаконтента в интерфейсе и сервисе теперь проще благодаря новым классам
MediaSession и
MediaController.
Новый класс MediaSession заменяет устаревший класс RemoteControlClient и предоставляет единый набор методов обратного вызова для обработки элементов управления воспроизведением и кнопок мультимедиа.
Если ваше приложение воспроизводит медиаконтент и работает на платформе Android TV или Wear, используйте класс MediaSession для управления воспроизведением с помощью одних и тех же методов обратного вызова.
Теперь вы можете создавать собственные приложения для управления мультимедиа с помощью нового класса MediaController. Этот класс предоставляет безопасный для потоков способ отслеживать и контролировать воспроизведение медиаконтента из процесса интерфейса приложения.
При создании контроллера укажите объект MediaSession.Token, чтобы ваше приложение могло взаимодействовать с элементом управления MediaSession.
С помощью методов MediaController.TransportControls можно отправлять команды, например play(), stop(), skipToNext() и setRating(), чтобы управлять воспроизведением медиаконтента в сеансе. С помощью контроллера также можно зарегистрировать объект MediaController.Callback, чтобы отслеживать изменения метаданных и состояния сеанса.
Кроме того, вы можете создавать расширенные уведомления, позволяющие управлять воспроизведением, связанным с сеансом работы с медиаконтентом, с помощью нового класса Notification.MediaStyle.
Просмотр медиаконтента
В Android 5.0 появилась возможность просматривать медиаконтент из библиотеки другого приложения с помощью нового API android.media.browse. Чтобы сделать медиаконтент в приложении доступным, расширьте класс MediaBrowserService. Реализация MediaBrowserService должна предоставлять доступ к MediaSession.Token, чтобы приложения могли воспроизводить медиаконтент, предоставляемый вашим сервисом.
Чтобы взаимодействовать со службой медиабраузера, используйте класс MediaBrowser. Укажите название компонента для элемента MediaSession при создании экземпляра MediaBrowser. Используя этот экземпляр браузера, ваше приложение может подключиться к связанному сервису и получить объект MediaSession.Token для воспроизведения контента, доступного через этот сервис.
Хранилище
Выбор каталога
В Android 5.0 Storage Access Framework был расширен, чтобы пользователи могли выбирать целые поддеревья каталогов и предоставлять приложениям доступ на чтение и запись ко всем содержащимся в них документам без необходимости подтверждать каждое действие.
Чтобы выбрать поддерево каталогов, создайте и отправьте намерение.
OPEN_DOCUMENT_TREE
Система отобразит все экземпляры DocumentsProvider, поддерживающие выбор поддерева, и позволит пользователю просматривать и выбирать каталоги. Возвращенный URI представляет собой доступ к выбранному поддереву. Затем вы можете использовать buildChildDocumentsUriUsingTree() и buildDocumentUriUsingTree() вместе с query(), чтобы изучить поддерево.
Новый метод createDocument() позволяет создавать документы и каталоги в любом месте поддерева. Чтобы управлять существующими документами, используйте
renameDocument() и
deleteDocument().
Прежде чем использовать эти вызовы, проверьте, поддерживаются ли они поставщиком, на странице COLUMN_FLAGS.
Если вы реализуете DocumentsProvider и хотите поддерживать выбор поддерева, реализуйте isChildDocument() и включите FLAG_SUPPORTS_IS_CHILD в COLUMN_FLAGS.
В Android 5.0 также появились новые каталоги для пакетов на общем хранилище, в которые приложение может помещать медиафайлы для включения в MediaStore. Новый метод getExternalMediaDirs() возвращает пути к этим каталогам на всех устройствах с общим хранилищем. Как и в случае с getExternalFilesDir(), приложению не требуются дополнительные разрешения для доступа к возвращенным путям. Платформа периодически сканирует эти каталоги на наличие новых медиафайлов, но вы также можете использовать MediaScannerConnection, чтобы явно запустить сканирование нового контента.
Беспроводная связь и подключение
Несколько сетевых подключений
В Android 5.0 появились новые API для работы с несколькими сетями, которые позволяют приложению динамически сканировать доступные сети с определенными возможностями и устанавливать с ними соединение. Эта функция полезна, если приложению требуется специализированная сеть, например SUPL, MMS или сеть оператора связи, или если вы хотите передавать данные с помощью определенного транспортного протокола.
Чтобы выбрать сеть и подключиться к ней динамически из приложения, выполните следующие действия:
- Создайте
ConnectivityManager. - Используйте класс
NetworkRequest.Builder, чтобы создать объектNetworkRequestи указать функции сети и тип транспорта, которые нужны вашему приложению. - Чтобы выполнить поиск подходящих сетей, вызовите метод
requestNetwork()илиregisterNetworkCallback()и передайте объектNetworkRequestи реализациюConnectivityManager.NetworkCallback. Используйте методrequestNetwork(), если хотите активно переключаться на подходящую сеть после ее обнаружения. Чтобы получать только уведомления о найденных сетях без активного переключения, используйте методregisterNetworkCallback().
Когда система обнаруживает подходящую сеть, она подключается к ней и вызывает обратный вызов onAvailable(). Объект Network из функции обратного вызова можно использовать, чтобы получить дополнительную информацию о сети или направить трафик на выбранную сеть.
Bluetooth с низким энергопотреблением
В Android 4.3 появилась поддержка платформы для Bluetooth с низким энергопотреблением (Bluetooth LE) в центральной роли. В Android 5.0 устройство Android может выступать в роли периферийного устройства Bluetooth LE. Приложения могут использовать эту функцию, чтобы сообщать о своем присутствии устройствам поблизости. Например, вы можете создать приложение, которое позволит устройству работать как шагомер или монитор здоровья и передавать данные другому устройству с поддержкой Bluetooth LE.
Новые API android.bluetooth.le позволяют приложениям транслировать рекламу, сканировать ответы и устанавливать соединения с устройствами Bluetooth LE поблизости. Чтобы использовать новые функции рекламы и сканирования, добавьте разрешение
BLUETOOTH_ADMIN
в манифест. Когда пользователи скачивают или обновляют ваше приложение в Google Play, им предлагается предоставить ему следующее разрешение: "Информация о подключении Bluetooth: позволяет приложению управлять Bluetooth, в том числе передавать данные на ближайшие устройства Bluetooth и получать информацию о них".
Чтобы начать трансляцию Bluetooth LE, чтобы другие устройства могли обнаружить ваше приложение, вызовите startAdvertising() и передайте реализацию класса AdvertiseCallback. Объект обратного вызова
получает отчет об успешном или неудачном выполнении рекламной операции.
В Android 5.0 появился класс ScanFilter, позволяющий приложению сканировать только определенные типы устройств. Чтобы начать сканирование устройств Bluetooth LE, вызовите startScan() и передайте список фильтров. В вызове метода также необходимо предоставить реализацию ScanCallback, чтобы сообщать о том, когда обнаруживается реклама Bluetooth LE.
Улучшения NFC
В Android 5.0 добавлены следующие улучшения, которые позволяют более широко и гибко использовать NFC:
- Android Beam теперь доступен в меню Поделиться.
- Чтобы поделиться данными с помощью Android Beam, ваше приложение может вызвать функцию
invokeBeam()на устройстве пользователя. В этом случае пользователю не нужно вручную прикладывать устройство к другому устройству с поддержкой NFC, чтобы завершить передачу данных. - Вы можете использовать новый метод
createTextRecord()для создания записи NDEF, содержащей текстовые данные в кодировке UTF-8. - Если вы разрабатываете платежное приложение, теперь вы можете динамически регистрировать идентификатор приложения NFC (AID), вызывая
registerAidsForService(). Вы также можете использоватьsetPreferredService(), чтобы задать сервис эмуляции карт, который будет использоваться, когда определенное действие находится на переднем плане.
Project Volta
В Android 5.0 мы не только добавили новые функции, но и улучшили работу батареи. Используйте новые API и инструменты, чтобы анализировать и оптимизировать энергопотребление приложения.
Планирование заданий
В Android 5.0 появился новый API JobScheduler, который позволяет оптимизировать время работы от батареи, определяя задачи, которые система должна выполнять асинхронно в более позднее время или при определенных условиях (например, когда устройство заряжается). Планирование заданий полезно в следующих ситуациях:
- Приложение выполняет фоновые задачи, которые можно отложить.
- Приложение выполняет задачи, которые лучше выполнять, когда устройство подключено к сети.
- Приложению нужно выполнить задачу, для которой требуется доступ к сети или подключение к Wi-Fi.
- В приложении есть несколько задач, которые нужно регулярно выполнять в пакетном режиме.
Единица работы инкапсулируется объектом JobInfo.
Этот объект определяет критерии планирования.
Используйте класс JobInfo.Builder, чтобы настроить выполнение запланированной задачи. Вы можете запланировать выполнение задачи при определенных условиях, например:
- Запускать, когда устройство заряжается
- Начать, когда устройство подключено к сети без ограничений трафика
- Запускать, когда устройство не используется
- завершить до определенного срока или с минимальной задержкой;
Например, вы можете добавить следующий код, чтобы задача выполнялась в сети без ограничений трафика:
Kotlin
val uploadTask: JobInfo = JobInfo.Builder( jobId, serviceComponent /* JobService component */ ).run { setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) build() } val jobScheduler = context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler jobScheduler.schedule(uploadTask)
Java
JobInfo uploadTask = new JobInfo.Builder(jobId, serviceComponent /* JobService component */) .setRequiredNetworkCapabilities(JobInfo.NETWORK_TYPE_UNMETERED) .build(); JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); jobScheduler.schedule(uploadTask);
Если устройство подключено к источнику питания более двух минут и уровень заряда батареи достаточный, система выполнит все запланированные задания, которые готовы к запуску, даже если срок их выполнения ещё не истек.
Пример использования JobScheduler API можно найти в образце реализации JobSchedulerSample в этой версии.
Инструменты разработчика для отслеживания расхода заряда батареи
Новая команда dumpsys batterystats позволяет получить интересные статистические данные о расходе заряда батареи на устройстве, упорядоченные по уникальному идентификатору пользователя (UID). Статистика включает:
- История событий, связанных с батареей
- Глобальная статистика устройства
- Приблизительный расход энергии на UID и системный компонент
- Мобильное время в миллисекундах на пакет для каждого приложения
- Агрегированная статистика системного UID
- Сводная статистика UID приложений
Нажмите на значок --help, чтобы узнать, как настроить результат. Например, чтобы вывести расход заряда батареи для определенного пакета приложений с момента последней зарядки устройства, выполните следующую команду:
$ adb shell dumpsys batterystats --charged <package-name>
Вы можете использовать инструмент Battery Historian для выходных данных команды dumpsys, чтобы создать HTML-визуализацию событий, связанных с питанием, из журналов. Эта информация поможет вам понять, почему батарея разряжается слишком быстро, и устранить проблему.
Android в организациях и учебных заведениях
Управляемая синхронизация
В Android 5.0 появились новые функции для запуска приложений в корпоративной среде. Администратор устройства может инициировать процесс управляемой инициализации, чтобы добавить на устройство управляемый профиль, если у пользователя уже есть личный аккаунт. Приложения, связанные с управляемыми профилями, показываются вместе с неуправляемыми приложениями в панели запуска, на экране недавних действий и в уведомлениях.
Чтобы начать процесс управляемой инициализации, отправьте ACTION_PROVISION_MANAGED_PROFILE в Intent. Если вызов будет выполнен успешно, система запустит обратный вызов onProfileProvisioningComplete().
Затем вы можете вызвать метод setProfileEnabled(), чтобы включить управляемый профиль.
По умолчанию в управляемом профиле включено лишь небольшое количество приложений.
Вы можете установить дополнительные приложения в управляемом профиле, вызвав enableSystemApp().
Если вы разрабатываете приложение Launcher, то можете использовать новый класс LauncherApps, чтобы получить список действий, которые можно запустить для текущего пользователя и связанных управляемых профилей. Панель запуска может сделать управляемые приложения более заметными, добавив к значку значок рабочего профиля. Чтобы извлечь значок с бейджем, отправьте вызов getUserBadgedIcon().
Чтобы узнать, как использовать новую функцию, ознакомьтесь с BasicManagedProfileпримером реализации в этом выпуске.
Владелец устройства
В Android 5.0 появилась возможность развертывать приложение владельца устройства. Владелец устройства – это особый тип администратора устройства, который может создавать и удалять дополнительных пользователей, а также настраивать глобальные параметры устройства. Приложение владельца устройства может использовать методы класса DevicePolicyManager, чтобы точно управлять конфигурацией, безопасностью и приложениями на управляемых устройствах.
У устройства может быть только один активный владелец.
Чтобы развернуть и активировать владельца устройства, необходимо передать данные NFC из приложения для программирования на устройство, пока оно не настроено. При передаче данных отправляется та же информация, что и при инициализации, описанной в разделе Управляемая инициализация.
Блокировка в приложении
В Android 5.0 представлен новый API блокировки в приложении, который позволяет временно запретить пользователям покидать ваше приложение или получать уведомления. Например, это может быть полезно, если вы разрабатываете образовательное приложение, которое должно соответствовать требованиям к проведению важных экзаменов на устройствах Android, или одноцелевое приложение для киоска. После того как приложение активирует блокировку в приложении, пользователи не могут просматривать уведомления, открывать другие приложения или возвращаться на главный экран, пока приложение не выйдет из этого режима.
Есть два способа включить блокировку в приложении:
- Вручную. Пользователи могут включить закрепление экрана в разделе Настройки > Безопасность > Закрепление экрана и выбрать задачи, которые нужно закрепить, нажав на зеленый значок булавки на экране недавних действий.
- Программно. Чтобы активировать блокировку в приложении программно, вызовите
startLockTask()из своего приложения. Если приложение, которое запрашивает закрепление, не является владельцем устройства, пользователю будет предложено подтвердить действие. Приложение владельца устройства может вызвать методsetLockTaskPackages(), чтобы разрешить закрепление приложений без подтверждения пользователя.
Если блокировка задач включена, происходит следующее:
- Строка состояния пуста, а уведомления и информация о статусе скрыты.
- Кнопки "Домой" и "Недавние приложения" скрыты.
- Другие приложения не могут запускать новые объекты activity.
- Текущее приложение может запускать новые действия, если при этом не создаются новые задачи.
- Если блокировка в приложении включена владельцем устройства, пользователь не сможет выйти из вашего приложения, пока оно не вызовет функцию
stopLockTask(). - Если блокировка в приложении активирована другим приложением, которое не является владельцем устройства, или пользователем напрямую, пользователь может выйти из режима, удерживая кнопки "Назад" и "Недавние".
Printing Framework
Визуализация PDF-файла как растрового изображения
Теперь вы можете преобразовывать страницы PDF-документов в растровые изображения для печати, используя новый класс PdfRenderer. Вам необходимо указать ParcelFileDescriptor, доступный для поиска (то есть контент, к которому можно получить случайный доступ), на котором система будет записывать контент для печати.
Чтобы получить страницу для отрисовки, приложение может использовать метод
openPage(), а затем вызвать метод
render()
чтобы преобразовать открытый PdfRenderer.Page в растровое изображение. Вы также можете задать дополнительные параметры, если хотите преобразовать в растровое изображение только часть документа (например, чтобы реализовать постраничную отрисовку для увеличения документа).
Пример использования новых API можно найти в разделе PdfRendererBasic.
Система
Статистика использования приложений
Теперь вы можете получить доступ к истории использования приложений на устройстве Android с помощью нового API android.app.usage. Этот API предоставляет более подробную информацию об использовании, чем устаревший метод getRecentTasks().
Чтобы использовать этот API, сначала нужно объявить разрешение "android.permission.PACKAGE_USAGE_STATS" в манифесте.
Пользователь также должен разрешить доступ для этого приложения в разделе Настройки > Безопасность > Приложения с доступом к данным об использовании.
Система собирает данные об использовании каждого приложения и агрегирует их по дням, неделям, месяцам и годам. Максимальный срок хранения этих данных в системе:
- Ежедневные данные: 7 дней.
- Еженедельные данные: 4 недели.
- Данные за месяц: 6 месяцев.
- Данные за год: 2 года.
Для каждого приложения система записывает следующие данные:
- Время последнего использования приложения.
- Общая продолжительность времени, в течение которого приложение было на переднем плане за определенный временной интервал (день, неделю, месяц или год).
- Метка времени, когда компонент (определяемый по названию пакета и активности) перешел на передний или задний план в течение дня.
- Запись временных меток при изменении конфигурации устройства (например, при изменении ориентации устройства из-за поворота).
Тестирование и специальные возможности
Тестирование и улучшения специальных возможностей
В Android 5.0 добавлена поддержка следующих функций для тестирования и специальных возможностей:
- Новые методы
getWindowAnimationFrameStats()иgetWindowContentFrameStats()собирают статистику кадров для анимации окон и контента. Эти методы позволяют писать инструментальные тесты, чтобы оценивать, достаточно ли часто приложение отрисовывает кадры для обеспечения удобства пользователей. - Новый метод
executeShellCommand()позволяет выполнять команды оболочки из инструментального теста. Выполнение команды похоже на запускadb shellс хоста, подключенного к устройству. Это позволяет использовать инструменты на основе оболочки, такие какdumpsys,am,contentиpm. - Сервисы специальных возможностей и инструменты тестирования, использующие API специальных возможностей (например,
UiAutomator), теперь могут получать подробную информацию о свойствах окон на экране, с которыми могут взаимодействовать пользователи без нарушений зрения. Чтобы получить список объектовAccessibilityWindowInfo, вызовите новый методgetWindows(). - Новый класс
AccessibilityNodeInfo.AccessibilityActionпозволяет задавать стандартные или специальные действия, которые будут выполняться с объектомAccessibilityNodeInfo. Новый классAccessibilityNodeInfo.AccessibilityActionзаменяет API, связанные с действиями, которые ранее находились вAccessibilityNodeInfo. - В Android 5.0 реализованы более точные настройки синтеза речи в приложении. Новый класс
Voiceпозволяет приложению использовать голосовые профили, связанные с определенными языковыми стандартами, оценками качества и задержки, а также параметрами, относящимися к определенному движку синтеза речи.
Способы ввода
Удобное переключение между языками ввода
В Android 5.0 и более поздних версий пользователи могут легко переключаться между всеми редакторами методов ввода (IME), поддерживаемыми платформой. Выполните назначенное действие для переключения (обычно это нажатие на значок глобуса на экранной клавиатуре). При этом будут поочередно выбраны все доступные методы ввода. Это изменение поведения реализовано с помощью метода shouldOfferSwitchingToNextInputMethod().
Кроме того, теперь фреймворк проверяет, есть ли в следующей IME механизм переключения (и, следовательно, поддерживает ли эта IME переключение на IME после нее). IME с механизмом переключения не будет переключаться на IME без него. Это изменение в поведении реализовано с помощью метода switchToNextInputMethod().
Пример использования обновленных API для переключения методов ввода можно найти в обновленном образце реализации экранной клавиатуры. Подробнее о том, как реализовать переключение между методами ввода…
Декларации в манифесте
Обязательные функции, которые можно декларировать
Теперь в элементе <uses-feature> поддерживаются следующие значения, поэтому вы можете настроить установку приложения только на устройствах, которые предоставляют необходимые ему функции.
FEATURE_AUDIO_OUTPUTFEATURE_CAMERA_CAPABILITY_MANUAL_POST_PROCESSINGFEATURE_CAMERA_CAPABILITY_MANUAL_SENSORFEATURE_CAMERA_CAPABILITY_RAWFEATURE_CAMERA_LEVEL_FULLFEATURE_GAMEPADFEATURE_LIVE_TVFEATURE_MANAGED_USERSFEATURE_LEANBACKFEATURE_OPENGLES_EXTENSION_PACKFEATURE_SECURELY_REMOVES_USERSFEATURE_SENSOR_AMBIENT_TEMPERATUREFEATURE_SENSOR_HEART_RATE_ECGFEATURE_SENSOR_RELATIVE_HUMIDITYFEATURE_VERIFIED_BOOTFEATURE_WEBVIEW
Разрешения пользователей
Теперь в элементе <uses-permission> можно указывать разрешение, необходимое приложению для доступа к определенным API.
BIND_DREAM_SERVICE: если целевой уровень API – 21 или выше, это разрешение требуется сервису Daydream, чтобы к нему могли подключаться только системные процессы.