API для Android 5.0

Уровень API: 21

В Android 5.0 (Lollipop) реализованы новые функции как для пользователей, так и для разработчиков приложений. Из этой статьи вы узнаете о самых важных особенностях новых API.

Чтобы получить общее представление о новых функциях платформы, прочитайте краткий обзор Android Lollipop.

Приступая к разработке

Чтобы создавать приложения для Android 5.0, вам потребуется Android SDK. Воспользуйтесь Менеджером SDK, чтобы загрузить платформу SDK для Android 5.0 и образы системы.

Обновление целевого уровня API

Чтобы оптимизировать приложение для устройств под управлением Android 5.0, настройте targetSdkVersion на уровень "21", установите приложение на образ системы Android 5.0, проверьте его, а затем опубликуйте обновленную версию.

Вы можете воспользоваться API Android 5.0 и для работы со старыми версиями. Для этого добавьте соответствующие данные в код, проверяющий уровень API перед выполнением функций, которые могут не поддерживаться minSdkVersion. Подробнее о том, как обеспечить совместимость с предыдущими версиями, читайте здесь.

Сведения об уровнях API представлены в этой статье.

Важные функциональные изменения

Если вы уже публиковали приложения для Android, учтите, что изменения в версии 5.0 могут повлиять на их работу.

Если вы не тестировали свое приложение в новой среде выполнения Android (ART)...

В версии 4.4 была представлена новая экспериментальная среда выполнения Android (ART). Ее можно было выбирать при необходимости, а по умолчанию использовалось решение Dalvik. Для Android 5.0 ART – среда выполнения по умолчанию.

Подробнее о новых функциях ART читайте здесь. Вот некоторые из них:

  • Предварительная компиляция (AOT).
  • Более эффективная очистка памяти.
  • Улучшенные методы отладки.

Большинство приложений для Android не потребуют никаких изменений при переходе на ART. Однако некоторые функции, действовавшие в Dalvik, поддерживаться не будут. Подробнее об этом читайте в разделе, который посвящен проверке работы приложения в среде выполнения ART. Будьте особо внимательны в следующих случаях:

  • Ваше приложение использует Java Native Interface (JNI) для выполнения кода C/C++.
  • Вы применяете инструменты для разработчиков, позволяющие создавать нестандартный код (в том числе для обфускации).
  • Ваши технологии нельзя применять, если используется очистка памяти с уплотнением. ART в настоящее время не поддерживает эту функцию, однако она разрабатывается в проекте ПО с открытым исходным кодом для Android.

Если в приложение нужно добавить уведомления...

При создании уведомлений учитывайте нововведения в Android 5.0. Подробнее об оповещениях для Android 5.0 и выше читайте в соответствующем руководстве.

Концепция Material Design

Уведомления выводятся с темным текстом на белом (или очень светлом) фоне. Это хорошо смотрится при использовании новых виджетов с текстурой. Убедитесь, что все ваши уведомления правильно выглядят в новой цветовой схеме. Если они отображаются некорректно, исправьте их:

  • Используйте метод setColor(), чтобы указать цвет фона значка.
  • Обновите или удалите ресурсы, в которых задействован цвет. Система обрабатывает только альфа-каналы как для значков действий, так и для основного значка уведомления. Учитывайте это. Система отображает значки уведомлений белым цветом, а значки действий – темно-серым.

Звук и вибрация

Если в настоящее время вы добавляете звуки и вибрацию в уведомления с помощью классов Ringtone, MediaPlayer или Vibrator, удалите этот код. Тогда система будет правильно обрабатывать уведомления с учетом приоритета. Чтобы добавить звуки и вибрацию, используйте методы Notification.Builder.

Чтобы войти в новый режим приоритета, выберите на устройстве настройку RINGER_MODE_SILENT. При выборе настроек RINGER_MODE_NORMAL или RINGER_MODE_VIBRATE режим приоритета отключается.

Раньше в системе Android для управления звуком на планшетах использовался основной поток STREAM_MUSIC. В Android 5.0 STREAM_RING и STREAM_NOTIFICATION будут поддерживаться как для телефонов, так и для планшетов.

Элементы на экране блокировки

По умолчанию в Android 5.0 уведомления показываются на экране блокировки. Однако пользователи могут включить функцию защиты личных данных. В таком случае система будет автоматически редактировать текст уведомлений. Чтобы настроить показ уведомлений, содержащих личные данные, используйте элемент setPublicVersion().

Если уведомление не содержит личных данных или вы хотите разрешить воспроизведение мультимедиа в нем, вызовите метод setVisibility() и задайте видимость уведомления как VISIBILITY_PUBLIC.

Воспроизведение мультимедиа

Если в ваших уведомлениях присутствуют сведения о воспроизведении мультимедиа или передаче данных, рекомендуем использовать новый шаблон Notification.MediaStyle вместо объекта RemoteViews.RemoteView. Какой бы вариант вы ни выбрали, убедитесь, что для отображения уведомления выбран вариант VISIBILITY_PUBLIC. Тогда управление мультимедиа будет доступно на экране блокировки. Учтите, что в Android 5.0 и последующих версиях будет прекращен показ объектов RemoteControlClient на экране блокировки. Подробнее читайте в разделе Если ваше приложение использует RemoteControlClient.

Всплывающие уведомления

Теперь уведомления могут отображаться в небольшом всплывающем окне, если устройство активно (то есть разблокировано, а экран включен). Они почти аналогичны компактным. Разница только в том, что во всплывающих окнах есть кнопки для выполнения действий. Пользователь может выполнить действие или закрыть уведомление, не покидая приложения.

Всплывающие уведомления появляются в следующих ситуациях:

  • Пользователь выполняет действия в полноэкранном режиме (приложение использует fullScreenIntent).
  • Уведомление имеет высокий приоритет, используется звук или вибрация.

Если при таких условиях в вашем приложении будут появляться всплывающие уведомления, убедитесь, что они отображаются корректно.

Если в приложении используется RemoteControlClient...

Класс RemoteControlClient теперь не поддерживается. Как можно скорее перейдите на API MediaSession.

На экране блокировки в Android 5.0 не отображаются кнопки управления передачей данных для MediaSession или RemoteControlClient. Вместо этого система показывает кнопки управления воспроизведением мультимедиа. Теперь вам проще выбрать их варианты, которые будут удобны как на заблокированном, так и разблокированном устройстве.

В Android 5.0 для этого имеется новый шаблон Notification.MediaStyle. Notification.MediaStyle конвертирует действия, добавленные с помощью Notification.Builder.addAction(), в компактные кнопки для уведомлений с возможностью воспроизведения мультимедиа. Чтобы сообщить системе о том, что уведомление связано с активным сеансом воспроизведения мультимедиа, необходимо передать токен сеанса в метод setSession().

Убедитесь, что выбран вариант отображения VISIBILITY_PUBLIC и уведомление будет появляться на экране блокировки, даже если включен режим безопасности. Подробнее об уведомлениях на экране блокировки читайте здесь.

Если ваше приложение работает на платформе Android TV или Wear, внедрите класс MediaSession. Он поддерживает показ кнопок для управления воспроизведением. Если приложение должно получать информацию о действиях с кнопками на устройствах Android, необходимо также внедрить MediaSession.

Если в приложении используется метод getRecentTasks()...

В Android 5.0 появилась новая функция одновременной работы с документами и процессами (см. ниже). Метод ActivityManager.getRecentTasks() больше не поддерживается. Чтобы обеспечить совместимость со старыми версиями, этот метод по-прежнему возвращает небольшое количество данных. Например, он вызывает собственные задачи приложения и некоторые другие задачи (например, переход на главную страницу). Если в вашем приложении применяется этот метод, замените его на getAppTasks().

Если вы используете Android Native Development Kit (NDK)...

Android 5.0 теперь поддерживает как 32- так и 64-разрядные системы. Поддержка 64-разрядных систем увеличивает производительность и расширяет пространство адресов. Также при этом повышается скорость работы OpenSSL для криптографии. Кроме того, в новом выпуске используются API NDK для мультимедиа, а также поддерживается OpenGL ES (GLES) 3.1.

Чтобы воспользоваться поддержкой 64-разрядных систем в Android 5.0, скачайте и установите NDK версии 10c со страницы Android NDK. Подробнее о важных изменениях и исправленных ошибках в NDK читайте в примечаниях к выпуску 10с.

Если ваше приложение связано с определенным сервисом...

Метод Context.bindService() теперь требует явного использования Intent, а при неявном выполняется исключение. Чтобы обеспечить безопасность приложения, используйте явную цель при запуске или связывании Service. Не применяйте фильтры цели для сервиса.

Если в приложении используется сервис WebView...

Android 5.0 изменяет функционирование вашего приложения по умолчанию.

  • Если приложение ориентировано на API уровня 21 или выше...
    • Система по умолчанию блокирует смешанный контент и сторонние файлы cookie. Чтобы разрешить передачу таких данных, используйте соответственно методы setMixedContentMode() и setAcceptThirdPartyCookies().
    • Теперь система целенаправленно выбирает разделы HTML-документа для извлечения. Такой подход уменьшает расход памяти и повышает производительность. Если вы хотите обработать весь документ сразу, отключите этот метод оптимизации путем вызова enableSlowWholeDocumentDraw().
  • Если приложение ориентировано на API ниже уровня 21, система будет поддерживать смешанный контент и внешние файлы cookie, а также обрабатывать документы полностью.

Пользовательский интерфейс

Material Design

В будущей версии Android поддерживается новая концепция Material Design. Вы сможете создавать приложения с обновленным динамичным дизайном и органично меняющимися элементами интерфейса. Поддерживаются следующие функции:

  • тема Material;
  • тени при просмотре;
  • виджет RecyclerView;
  • графическая анимация и эффекты;
  • анимация Material Design и эффекты отклика на действия;
  • инструменты для настройки свойств с учетом статуса просмотра;
  • настраиваемые виджеты для интерфейса и панели с цветовыми палитрами;
  • анимированная и неанимированная векторная графика на основе XML.

Подробнее о том, как добавить элементы этого дизайна в свое приложение, читайте в разделе Material Design.

Одновременный просмотр документов и процессов на экране

В предыдущих выпусках на экране недавно использованных функций могла отображаться только одна задача для каждого приложения. Теперь там могут быть представлены и несколько задач, если вы одновременно работали с несколькими документами. Эта функция обеспечивает многозадачность, позволяя быстро переключаться между отдельными действиями и документами в списке недавно использованных. Одновременно выполняемыми задачами могут быть вкладки, открытые в веб-браузере, документы, одновременные состязания в игре или чаты в социальном приложении. Приложение может управлять задачами с помощью класса ActivityManager.AppTask.

Чтобы вставить логический перерыв, после которого система будет воспринимать действие как новое, используйте FLAG_ACTIVITY_NEW_DOCUMENT при запуске действия с помощью startActivity(). Также можно выбрать для атрибута элемента <activity> documentLaunchMode значение "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(). У вашего приложения должны быть все разрешения от Android на доступ к этим ресурсам. Тогда оно сможет передать их элементу WebView.

Новый метод 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 (в том числе об определении поддерживаемой версии), читайте в соответствующем руководстве по API.

Набор расширений для Android

Помимо 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>

Мультимедиа

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. Его свойства примерно соответствуют устаревшему API Camera.
  • Устройства, которые поддерживают ПО уровня INFO_SUPPORTED_HARDWARE_LEVEL_FULL, позволяют вручную управлять съемкой и обработкой изображений в высоком разрешении и с высокой кадровой частотой.

Подробнее об использовании обновленного 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 для взаимодействия с сервисом браузера для мультимедиа. При создании экземпляра MediaBrowser укажите название компонента для MediaSession. С помощью этого экземпляра браузера ваше приложение сможет подключиться к указанному сервису и получить объект MediaSession.Token для воспроизведения контента.

Хранение данных

Выбор каталогов

В Android 5.0 расширена инфраструктура обращения к памяти, что позволяет пользователям выбирать целое поддерево каталога. Приложения получают доступ к чтению/записи во всех документах. Пользователю не приходится каждый раз подтверждать это.

Чтобы выбрать поддерево каталога, создайте и отправьте цель 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 или сети с биллингом оператора связи, а также если для отправки данных используется определенный протокол.

Чтобы приложение регулярно выполняло поиск доступных сетей и подключалось к ним, выполните следующие действия:

  1. Создайте ConnectivityManager.
  2. Используйте класс NetworkRequest.Builder для создания объекта NetworkRequest, укажите свойства сети и тип перехода, необходимый для приложения.
  3. Чтобы выполнить поиск подходящих сетей, вызовите requestNetwork() или registerNetworkCallback() и передайте объект NetworkRequest, а также внедрите ConnectivityManager.NetworkCallback. Если вы хотите сразу переключаться на подходящую сеть при ее обнаружении, используйте метод requestNetwork(). Если же вам нужно только получать уведомления о найденных сетях, используйте registerNetworkCallback().

При обнаружении подходящей сети система подключается к ней и отправляет ответ onAvailable(). Для получения дополнительных сведений о сети можно использовать объект Network в ответе. Он же применяется для перенаправления трафика в выбранную сеть.

Низкоэнергетический Bluetooth

В Android версии 4.3 была представлена поддержка низкоэнергетического Bluetooth (Bluetooth LE) как основного способа передачи данных. Устройство на Android 5.0 может быть периферийным с поддержкой Bluetooth низкой мощности. Эта функция позволяет приложениям связываться с устройствами, расположенными неподалеку. Например, ваше приложение может работать как шагомер или отслеживать иные показатели, передавая данные на другое близко расположенное устройство по сети Bluetooth.

Новый API android.bluetooth.le позволяет приложениям передавать рекламу, получать отчеты и устанавливать связь с другими устройствами, поддерживающими Bluetooth LE. Чтобы воспользоваться новыми функциями, добавьте в манифест разрешение BLUETOOTH_ADMIN. Скачивая приложение или обновления для него в Google Play, пользователи должны дать разрешение на сбор данных о Bluetooth, управление этой функцией, а также на обмен информацией с устройствами по соседству.

Чтобы начать передачу рекламы по Bluetooth LE на другие устройства, вызовите startAdvertising() и передайте данные о внедрении класса AdvertiseCallback. Объект обратного вызова получает отчет об успешном или неуспешном показе рекламы.

С помощью класса ScanFilter, который появился в Android 5.0, ваше приложение сможет искать только определенные типы устройств. Чтобы начать поиск устройств с поддержкой Bluetooth LE, вызовите startScan() и передайте список фильтров. При вызове метода также следует внедрить ScanCallback, чтобы получать уведомления о найденной рекламе.

Новые возможности 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. Вы можете указать определенные условия, например:

  • Запуск при зарядке устройства.
  • Запуск при подключении устройства к неограниченной сети.
  • Запуск в режиме ожидания.
  • Завершение в указанный срок или максимально быстрое выполнение.

Например, для выполнения задачи в неограниченной сети можно добавить следующий код:

JobInfo uploadTask = new JobInfo.Builder(mJobId,
                                         mServiceComponent /* JobService component */)
        .setRequiredNetworkCapabilities(JobInfo.NetworkType.UNMETERED)
        .build();
JobScheduler jobScheduler =
        (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(uploadTask);

Если питание устройства стабильно (то есть оно подключено к сети более 2 минут, а аккумулятор достаточно заряжен), система будет выполнять все запланированные задания, даже если указанное время еще не наступило.

Пример использования API JobScheduler см. в образце JobSchedulerSample данного выпуска.

Инструменты для разработчиков (использование батареи)

Новая команда dumpsys batterystats позволяет получить интересные статистические данные об использовании аккумуляторов в устройствах (с учетом уникальных идентификаторов пользователей – 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().

В модулях запуска можно использовать новый класс LauncherApps, чтобы получить список возможных действий для текущего пользователя и для всех связанных с ним контролируемых профилей. Контролируемые приложения могут быть отмечены дополнительным значком. Чтобы добавить значок, вызовите getUserBadgedIcon().

Подробнее об использовании новых функций см. в примере внедрения BasicManagedProfile в данном выпуске.

Владелец устройства

В Android 5.0 можно использовать приложение, которое назначает владельца устройства. Владелец устройства – это администратор устройства, который может создавать и удалять вторичных пользователей, а также менять глобальные настройки. Он использует методы из класса DevicePolicyManager для точного управления конфигурацией, безопасностью и приложениями на доступных устройствах. У устройства может быть только один действующий владелец в определенный момент времени.

Чтобы использовать эту функцию, необходимо с помощью NFC перенести данные из программируемого приложения на устройство, которое ещё не сконфигурировано. При этом передаются те же данные, что и в процессе, который описан в разделе Контролируемые профили.

Блокировка в приложении

В Android 5.0 используется новый API для блокировки в приложении. С его помощью можно временно запретить пользователям отменять задачи или получать уведомления. Это может быть полезно, например, если вы разрабатываете образовательные приложения, требующие высокой степени контроля, а также однозадачные или киоск-приложения. При такой блокировке пользователи не смогут просматривать уведомления, открывать другие приложения или переходить на главный экран, пока этот режим не будет отключен.

Режим блокировки в приложении можно активировать двумя способами:

  • Вручную. В разделе Настройки > Безопасность > Блокировка в приложении пользователи могут выбрать задачи, которые требуется закрепить. Нужно просто нажать на зеленый значок.
  • Программно. Вызовите в приложении startLockTask(), чтобы активировать блокировку. Если запрашивающее приложение не является владельцем устройства, пользователь должен будет подтвердить действие. Владелец устройства может вызвать метод setLockTaskPackages(), чтобы разрешить приложениям активировать этот режим без согласия пользователя.

Если блокировка задач активна, происходит следующее:

  • Строка состояния пуста, уведомления и сведения о состоянии скрыты.
  • Кнопки для перехода на главную страницу и к списку недавно использованных приложений скрыты.
  • Новые действия в других приложениях недоступны.
  • В действующем приложении действия выполняться могут, если при этом не создаются новые задачи.
  • Если блокировка в приложении активирована владельцем устройства, пользователь не может выйти из приложения, пока последний не вызовет stopLockTask().
  • Если блокировка активирована другим приложением или самим пользователем, переключиться в другой режим можно, нажав кнопки "Назад" и "Недавние".

Инфраструктура печати

Обработка PDF как растрового изображения

Теперь PDF-документы можно превращать в растровые изображения для печати. Для этого создан новый класс PdfRenderer. Необходимо указать атрибут ParcelFileDescriptor с возможностью поиска (чтобы обеспечить удобный доступ к контенту). Система добавит туда содержимое для печати. Приложение получает страницу с помощью openPage(), а затем вызывает render(), чтобы преобразовать PdfRenderer.Page в растровый формат. Вы также можете настроить дополнительные параметры, если в графический файл необходимо превратить только часть документа (например, для мозаичной обработки и увеличения фрагментов).

Подробнее об использовании нового API см. в примере PdfRendererBasic.

Система

Статистика по использованию приложений

Новый API android.app.usage позволяет просматривать историю использования приложений на устройствах Android. При этом вы получаете более подробные данные, чем в случае с устаревшим методом getRecentTasks(). Чтобы использовать новый API, необходимо добавить разрешение "android.permission.PACKAGE_USAGE_STATS" в манифест. Пользователь также должен разрешить доступ к этому приложению в разделе Настройки > Безопасность > Приложения.

Система собирает данные об использовании отдельных приложений за день, неделю, месяц и год. Максимальные сроки хранения данных в системе:

  • Ежедневные: 7 дней.
  • Еженедельные: 1 месяц.
  • Ежемесячные: 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 позволяет использовать в приложении голосовые профили, связанные с определенными локалями, качеством и временем реакции, а также задавать параметры для определенных систем.

Редактор способов ввода (IME)

Упрощенное переключение между языками ввода

В Android 5.0 пользователям будет проще переключаться между редакторами способов ввода, которые поддерживаются платформой. С помощью одного действия (обычно это нажатие на значок глобуса на электронной клавиатуре) можно будет переключаться между всеми доступными языками. Это обеспечивается посредством метода shouldOfferSwitchingToNextInputMethod().

Кроме того, теперь инфраструктура проверяет, есть ли в следующем редакторе механизм переключения (то есть поддерживается ли такая функция). Для замены всегда выбирается редактор способов ввода с механизмом переключения. Это обеспечивается посредством метода switchToNextInputMethod().

Пример использования обновленного API для переключения способов ввода см. в образце внедрения клавиатуры в данном выпуске. Подробнее о том, как обеспечить переключение между способами, читайте в разделе Создание способов ввода.

Объявление манифеста

Объявляемые обязательные функции

В элементе <uses-feature> теперь могут содержаться приведенные ниже значения, а ваше приложение будет устанавливаться только на устройства, обладающие нужными функциями.

Разрешения для пользователей

В элементе <uses-permission> теперь поддерживается приведенное ниже разрешение, с помощью которого вы сможете обеспечить доступ приложения к определенным API.

  • BIND_DREAM_SERVICE: при работе с API уровня 21 и выше это разрешение требуется для сервиса Daydream, чтобы к нему могла подключаться только система.