Уровень API: 12
Платформа Android 3.1 (HONEYCOMB_MR1) доступна разработчикам в виде скачиваемого компонента для Android SDK. Скачиваемая платформа включает библиотеку Android, образ системы, набор обложек эмулятора и другие компоненты. Скачиваемая платформа не содержит внешних библиотек.
Платформа Android 3.1 доступна разработчикам в виде скачиваемого компонента для Android SDK. Скачиваемая платформа включает библиотеку Android, образ системы, набор обложек эмулятора и другие компоненты. Чтобы начать разработку или тестирование для Android 3.1, скачайте платформу в SDK с помощью Android SDK Manager.
Общие сведения об API
В разделах ниже приведен технический обзор новых возможностей для разработчиков в Android 3.1, включая новые функции и изменения в API фреймворка по сравнению с предыдущей версией.
USB API
В Android 3.1 появились новые мощные API для интеграции подключенных периферийных устройств с приложениями, работающими на платформе. API основаны на стеке USB (универсальной последовательной шины) и сервисах, встроенных в платформу, включая поддержку взаимодействия как с хостом, так и с устройством USB. С помощью API разработчики могут создавать приложения, которые могут обнаруживать, взаимодействовать и управлять различными типами устройств, подключенных через USB.
Стек и API различают два основных типа USB-оборудования в зависимости от того, выступает ли устройство Android в качестве хоста или хостом является внешнее оборудование:
- USB-устройство – это подключенное оборудование, которое зависит от устройства Android, выступающего в качестве хоста. Например, большинство устройств ввода, мышей и джойстиков являются USB-устройствами, как и многие камеры, концентраторы и так далее.
- USB-аксессуар – это подключенное оборудование, которое имеет хост-контроллер USB, обеспечивает питание и предназначено для связи с устройствами Android через USB. В качестве аксессуаров можно подключать различные периферийные устройства, от контроллеров робототехники до музыкального оборудования, велотренажеров и т. д.
Для обоих типов (USB-устройств и USB-аксессуаров) USB API платформы поддерживают обнаружение с помощью широковещательной рассылки намерений при подключении или отключении, а также стандартные интерфейсы, конечные точки и режимы передачи (управление, массовая передача и прерывание).
USB API доступны в пакете android.hardware.usb. Основной класс – UsbManager. Он предоставляет вспомогательные методы для идентификации USB-устройств и USB-аксессуаров и обмена данными с ними. Приложения могут получить экземпляр UsbManager, запросить список подключенных устройств или аксессуаров, а затем взаимодействовать с ними или управлять ими.
UsbManager также объявляет действия intent, которые система транслирует, чтобы сообщить о подключении или отключении USB-устройства или аксессуара.
Другие классы:
UsbDevice– класс, представляющий внешнее оборудование, подключенное как USB-устройство (при этом устройство Android выступает в качестве хоста).UsbAccessory, представляющий внешнее оборудование, подключенное в качестве хоста USB (при этом устройство Android действует как USB-устройство).UsbInterfaceиUsbEndpoint, которые предоставляют доступ к стандартным интерфейсам и конечным точкам USB для устройства.UsbDeviceConnectionиUsbRequestдля синхронной и асинхронной отправки и получения данных и управляющих сообщений на USB-устройство или с него.UsbConstants, который предоставляет константы для объявления типов конечных точек, классов устройств и т. д.
Обратите внимание, что хотя стек USB встроен в платформу, фактическая поддержка режима USB-хоста и режима открытых аксессуаров на конкретных устройствах определяется их производителями. В частности, для режима хоста требуется соответствующий аппаратный USB-контроллер на устройстве Android.
Кроме того, разработчики могут запросить фильтрацию в Google Play, чтобы их приложения не были доступны пользователям, чьи устройства не обеспечивают соответствующую поддержку USB. Чтобы запросить фильтрацию, добавьте в манифест приложения один или оба элемента, указанных ниже.
- Если приложение должно быть доступно только для устройств, поддерживающих режим USB-хоста (подключение USB-устройств), объявите следующий элемент:
<uses-feature android:name="android.hardware.usb.host" android:required="true"> - Если приложение должно быть доступно только для устройств, поддерживающих USB-аксессуары (подключение USB-хостов), объявите следующий элемент:
<uses-feature android:name="android.hardware.usb.accessory" android:required="true">
Полную информацию о разработке приложений, взаимодействующих с USB-аксессуарами, можно найти в документации для разработчиков.
Примеры приложений, использующих USB Host API, можно найти в разделах ADB Test и Missile Launcher.
MTP/PTP API
В Android 3.1 представлен новый API MTP, который позволяет приложениям напрямую взаимодействовать с подключенными камерами и другими устройствами PTP. Новый API позволяет приложению получать уведомления о подключении и отключении устройств, управлять файлами и хранилищем на этих устройствах, а также передавать файлы и метаданные на них и с них. MTP API реализует подмножество PTP (Picture Transfer Protocol) спецификации MTP (Media Transfer Protocol).
MTP API доступен в пакете android.mtp и предоставляет следующие классы:
- Класс
MtpDeviceинкапсулирует устройство MTP, подключенное через хост-шину USB. Приложение может создать экземпляр объекта этого типа, а затем использовать его методы для получения информации об устройстве и хранящихся на нем объектах, а также для открытия подключения и передачи данных. Вот некоторые из них:getObjectHandles()возвращает список дескрипторов для всех объектов на устройстве, которые соответствуют указанному формату и родительскому объекту. Чтобы получить информацию об объекте, приложение может передать дескриптор вgetObjectInfo().importFile()позволяет приложению копировать данные объекта в файл на внешнем накопителе. Этот вызов может блокироваться на произвольное время в зависимости от размера данных и скорости устройств, поэтому его следует выполнять из отдельного потока.open()Разрешает приложению открывать подключенное устройство MTP/PTP.getThumbnail()возвращает уменьшенное изображение объекта в виде массива байтов.
MtpStorageInfoсодержит информацию о блоке хранения на устройстве MTP, соответствующую набору данных StorageInfo, описанному в разделе 5.2.2 спецификации MTP. Методы в классе позволяют приложению получить строку описания хранилища, свободное место, максимальную емкость хранилища, идентификатор хранилища и идентификатор тома.MtpDeviceInfoсодержит информацию об устройстве MTP, соответствующую набору данных DeviceInfo, описанному в разделе 5.1.1 спецификации MTP. Методы в классе позволяют приложениям получать информацию о производителе, модели, серийном номере и версии устройства.MtpObjectInfoсодержит информацию об объекте, хранящемся на устройстве MTP, которая соответствует набору данных ObjectInfo, описанному в разделе 5.3.1 спецификации MTP. Методы в классе позволяют приложениям получать размер объекта, формат данных, тип ассоциации, дату создания и информацию об эскизе.MtpConstantsпредоставляет константы для объявления кодов формата файлов MTP, типа ассоциации и статуса защиты.
Поддержка новых устройств ввода и событий движения
В Android 3.1 расширена подсистема ввода, чтобы поддерживать новые устройства ввода и новые типы событий движения во всех представлениях и окнах. Разработчики могут использовать эти возможности, чтобы пользователи могли взаимодействовать с их приложениями с помощью мышей, трекболов, джойстиков, геймпадов и других устройств, помимо клавиатур и сенсорных экранов.
Для обработки ввода с помощью мыши, колесика прокрутки и трекбола платформа поддерживает два новых действия событий движения:
ACTION_SCROLL– описывает местоположение указателя, в котором произошла прокрутка без касания, например с помощью колеса прокрутки мыши. В MotionEvent значение осейAXIS_HSCROLLиAXIS_VSCROLLопределяет относительное движение прокрутки.ACTION_HOVER_MOVE– сообщает текущее положение мыши, когда не нажаты никакие кнопки, а также любые промежуточные точки с момента последнего событияHOVER_MOVE. Уведомления о наведении курсора и его уходе пока не поддерживаются.
Для поддержки джойстиков и геймпадов в класс InputDevice добавлены следующие новые источники устройств ввода:
SOURCE_CLASS_JOYSTICK– у исходного устройства есть оси джойстика.SOURCE_CLASS_BUTTON– на исходном устройстве есть кнопки или клавиши.SOURCE_GAMEPAD– на исходном устройстве есть кнопки геймпада, напримерKEYCODE_BUTTON_AилиKEYCODE_BUTTON_B. ПодразумеваетSOURCE_CLASS_BUTTONSOURCE_JOYSTICK– у исходного устройства есть оси джойстика. Подразумевает SOURCE_CLASS_JOYSTICK.
Чтобы описывать события движения, поступающие от этих новых источников, а также от мышей и трекболов, платформа теперь определяет коды осей в MotionEvent, аналогично тому, как она определяет коды клавиш в KeyEvent. Новые коды осей для джойстиков и игровых контроллеров включают AXIS_HAT_X, AXIS_HAT_Y, AXIS_RTRIGGER, AXIS_ORIENTATION, AXIS_THROTTLE и многие другие.
Существующие оси MotionEvent представлены следующими тегами: AXIS_X, AXIS_Y, AXIS_PRESSURE, AXIS_SIZE, AXIS_TOUCH_MAJOR, AXIS_TOUCH_MINOR, AXIS_TOOL_MAJOR, AXIS_TOOL_MINOR и AXIS_ORIENTATION.
Кроме того, в MotionEvent определен ряд общих кодов осей, которые используются, когда фреймворк не знает, как сопоставить определенную ось. Определенные устройства могут использовать общие коды осей для передачи пользовательских данных о движении в приложения. Полный список осей и их интерпретаций приведен в документации по классу MotionEvent.
Платформа предоставляет приложениям события движения пакетами, поэтому одно событие может содержать текущую позицию и несколько так называемых исторических движений.
Приложения должны использовать getHistorySize(), чтобы получить количество исторических выборок, а затем извлечь и обработать все исторические выборки по порядку с помощью getHistoricalAxisValue(). После этого приложения должны обработать текущий образец с помощью getAxisValue().
Некоторые оси можно получить с помощью специальных методов доступа. Например, вместо вызова getAxisValue() приложения могут вызывать getX(). Оси со встроенными методами доступа: AXIS_X, AXIS_Y, AXIS_PRESSURE, AXIS_SIZE, AXIS_TOUCH_MAJOR, AXIS_TOUCH_MINOR, AXIS_TOOL_MAJOR, AXIS_TOOL_MINOR и AXIS_ORIENTATION.
Каждому устройству ввода присваивается уникальный идентификатор. Устройство может предоставлять несколько источников. Если устройство предоставляет несколько источников, то несколько источников могут предоставлять данные оси, используя одну и ту же ось. Например, событие касания, поступающее от источника касания, использует ось X для данных о положении экрана, в то время как событие джойстика, поступающее от источника джойстика, вместо этого будет использовать ось X для положения джойстика. Поэтому важно, чтобы приложения интерпретировали значения осей в соответствии с источником, из которого они поступают. При обработке события движения приложения должны использовать методы класса InputDevice, чтобы определить оси, поддерживаемые устройством или источником. В частности, приложения могут использовать getMotionRanges() для запроса всех осей устройства или всех осей заданного источника устройства. В обоих случаях информация о диапазоне для осей, возвращаемая в объекте InputDevice.MotionRange, указывает источник для каждого значения оси.
Наконец, поскольку события движения от джойстиков, геймпадов, мышей и трекболов не являются событиями касания, платформа добавляет новый метод обратного вызова для передачи их в View как "общие" события движения.
В частности, события движения, не связанные с касанием, передаются в View через вызов onGenericMotionEvent(), а не onTouchEvent().
Платформа по-разному обрабатывает общие события движения в зависимости от класса источника события. События SOURCE_CLASS_POINTER отправляются в View под указателем, как и события касания. Все остальные команды будут отправлены в View, который сейчас в фокусе.
Например, чтобы получать события джойстика, фокус должен быть установлен на View. При необходимости приложения могут обрабатывать эти события на уровне Activity или Dialog, реализуя там onGenericMotionEvent().
Пример приложения, в котором используются события движения джойстика, можно найти в разделах GameControllerInput и GameView.
RTP API
В Android 3.1 есть API для встроенного стека протокола RTP (Real-time Transport Protocol), который приложения могут использовать для управления потоковой передачей данных по запросу или в интерактивном режиме. В частности, приложения, которые обеспечивают IP-телефонию, полудуплексную связь, конференц-связь и потоковую передачу аудио, могут использовать API для запуска сеансов и передачи или приема потоков данных по любой доступной сети.
API RTP доступен в пакете android.net.rtp. Примеры занятий:
RtpStream– базовый класс потоков, которые отправляют и получают сетевые пакеты с медиаданными по протоколу RTP.AudioStream– подклассRtpStream, который передает аудиоданные по протоколу RTP.AudioGroup– локальный аудиоцентр для управления динамиком, микрофоном иAudioStreamустройства, а также микширования звука.AudioCodec, который содержит набор кодеков, определенных вами дляAudioStream.
Для поддержки аудиоконференций и аналогичных сценариев использования приложение создает экземпляры двух классов в качестве конечных точек для потока:
AudioStreamуказывает удаленную конечную точку и состоит из сопоставления сети и настроенногоAudioCodec.AudioGroupпредставляет локальную конечную точку для одного или несколькихAudioStream.AudioGroupсмешивает всеAudioStreamи при необходимости одновременно взаимодействует с динамиком и микрофоном устройства.
Простейший вариант использования включает одну удаленную конечную точку и локальную конечную точку.
Для более сложных случаев ознакомьтесь с ограничениями, описанными для AudioGroup.
Чтобы использовать RTP API, приложения должны запрашивать разрешение у пользователя, объявляя <uses-permission
android:name="android.permission.INTERNET"> в файлах манифеста. Чтобы получить доступ к микрофону устройства, также требуется разрешение <uses-permission
android:name="android.permission.RECORD_AUDIO">.
Виджеты приложений с настраиваемым размером
Начиная с Android 3.1 разработчики могут создавать виджеты для главного экрана, размер которых можно изменять по горизонтали, вертикали или в обоих направлениях. Чтобы изменить размер виджета, пользователю нужно нажать на него и удерживать, а затем перетащить горизонтальные и/или вертикальные маркеры изменения размера.
Разработчики могут сделать любой виджет на главном экране масштабируемым, определив атрибут resizeMode в метаданных AppWidgetProviderInfo виджета. Возможные значения атрибута resizeMode: horizontal, vertical и none.
Чтобы разрешить изменение размера виджета по горизонтали и вертикали, укажите значение "horizontal|vertical".
Рассмотрим пример.
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="294dp" android:minHeight="72dp" android:updatePeriodMillis="86400000" android:previewImage="@drawable/preview" android:initialLayout="@layout/example_appwidget" android:configure="com.example.android.ExampleAppWidgetConfigure" android:resizeMode="horizontal|vertical" > </appwidget-provider>
Дополнительную информацию о виджетах для главного экрана можно найти в документации по виджетам приложений.
Фреймворк анимации
- Новый класс ViewPropertyAnimator
- Новый класс
ViewPropertyAnimatorпозволяет разработчикам анимировать выбранные свойства объектовView. Этот класс автоматизирует и оптимизирует анимацию свойств, а также упрощает управление несколькими одновременными анимациями объектаView.Использовать
ViewPropertyAnimatorочень просто. Чтобы анимировать свойства объектаView, вызовите методanimate()и создайте объектViewPropertyAnimatorдля этогоView. Используйте методыViewPropertyAnimator, чтобы указать, какое свойство нужно анимировать и как. Например, чтобы сделатьViewпрозрачным, вызовите методalpha(0);. ОбъектViewPropertyAnimatorобрабатывает сведения о настройке базового классаAnimatorи его запуске, а затем отрисовывает анимацию.
- Новый класс
- Цвет фона анимации
- Новые методы
getBackgroundColor()иsetBackgroundColor(int)позволяют получать и задавать цвет фона за анимацией (только для анимации окон). В настоящее время фон должен быть черным, с любым желаемым уровнем альфа-канала.
- Новые методы
- Получение анимированной дроби из
ViewAnimator- Новый метод
getAnimatedFraction()позволяет получить текущую долю анимации – прошедшую/интерполированную долю, использованную в последнем обновлении кадра – изValueAnimator.
- Новый метод
Фреймворк пользовательского интерфейса
- Принудительная отрисовка слоя.
- Новый метод
buildLayer()позволяет приложению принудительно создавать слой View и сразу же отрисовывать в нем View. Например, приложение может использовать этот метод, чтобы отрисовать View в своем слое перед началом анимации. Если представление сложное, его рендеринг в слое перед запуском анимации позволит избежать пропуска кадров.
- Новый метод
- Расстояние до камеры
- Приложения могут использовать новый метод
setCameraDistance(float), чтобы задавать расстояние от камеры до объекта View. Это позволяет приложениям лучше контролировать 3D-преобразования View, например повороты.
- Приложения могут использовать новый метод
- Получение представления календаря из DatePicker
- Новый метод
getCalendarView()позволяет получитьCalendarViewиз экземпляраDatePicker.
- Новый метод
- Получение обратных вызовов при отсоединении представлений
- Новый класс
View.OnAttachStateChangeListenerпозволяет получать обратные вызовы, когда объект View прикрепляется к окну или открепляется от него. Чтобы добавить прослушиватель, используйтеaddOnAttachStateChangeListener(), а чтобы удалить –addOnAttachStateChangeListener().
- Новый класс
- Прослушиватель подсказок фрагментов, новая сигнатура onInflate()
- Новый метод
setOnBreadCrumbClickListener()позволяет приложениям перехватывать клики по навигационным цепочкам фрагментов и выполнять необходимые действия перед переходом к записи в стеке возврата или фрагменту, по которому был выполнен клик. - В классе
Fragmentбольше не поддерживаетсяonInflate(attrs, savedInstanceState). Вместо нее используйтеonInflate(activity, attrs, savedInstanceState).
- Новый метод
- Показывать результаты поиска в новой вкладке
- Ключ данных
EXTRA_NEW_SEARCHдля намеренийACTION_WEB_SEARCHпозволяет открывать поиск в новой вкладке браузера, а не в существующей.
- Ключ данных
- Текстовый курсор, который можно нарисовать
- Теперь вы можете указать объект Drawable, который будет использоваться в качестве текстового курсора, с помощью нового атрибута ресурса
textCursorDrawable.
- Теперь вы можете указать объект Drawable, который будет использоваться в качестве текстового курсора, с помощью нового атрибута ресурса
- Настройка отображаемого дочернего элемента в удаленных представлениях
- В подклассах
RemoteViewsдоступен новый удобный методsetDisplayedChild(viewId, childIndex), который позволяет задать дочерний элемент, отображаемый в подклассахViewAnimatorиAdapterViewAnimator, таких какAdapterViewFlipper,StackView,ViewFlipperиViewSwitcher.
- В подклассах
- Общие клавиши для геймпадов и других устройств ввода.
KeyEventдобавляет ряд общих кодов клавиш для кнопок геймпада. Этот класс также добавляетisGamepadButton(int)и несколько других вспомогательных методов для работы с кодами клавиш.
Графика
- Вспомогательные инструменты для управления растровыми изображениями.
setHasAlpha(boolean)позволяет приложению указать, что все пиксели в растровом изображении непрозрачны (false) или что некоторые пиксели могут содержать непрозрачные альфа-значения (true). Обратите внимание, что для некоторых конфигураций (например, RGB_565) этот вызов игнорируется, поскольку они не поддерживают значения альфа-канала для каждого пикселя. Это подсказка для рисования, поскольку в некоторых случаях непрозрачное растровое изображение может быть нарисовано быстрее, чем изображение с непрозрачными значениями альфа-канала для каждого пикселя.getByteCount()возвращает размер растрового изображения в байтах.getGenerationId()позволяет приложению узнать, было ли изменено растровое изображение, например для кеширования.sameAs(android.graphics.Bitmap)определяет, отличается ли заданный объект Bitmap от текущего по размеру, конфигурации или данным пикселей.
- Настройка местоположения и поворота камеры
- В
Cameraдобавлены два новых метода,rotate()иsetLocation(), для управления положением камеры при 3D-преобразованиях.
- В
Сеть
- Блокировка Wi-Fi с высокой производительностью
- Новая высокопроизводительная блокировка Wi-Fi позволяет приложениям поддерживать высокопроизводительные подключения по Wi-Fi, даже когда экран устройства выключен. Приложения, которые транслируют музыку, видео или голос в течение длительного времени, могут использовать высокопроизводительную блокировку Wi-Fi, чтобы обеспечить производительность потоковой передачи, даже когда экран выключен. Поскольку при этом потребляется больше энергии, приложения должны использовать высокопроизводительный Wi-Fi, когда есть необходимость в длительном активном подключении.
Чтобы создать блокировку с высокой производительностью, передайте
WIFI_MODE_FULL_HIGH_PERFв качестве режима блокировки в вызовеcreateWifiLock().
- Новая высокопроизводительная блокировка Wi-Fi позволяет приложениям поддерживать высокопроизводительные подключения по Wi-Fi, даже когда экран устройства выключен. Приложения, которые транслируют музыку, видео или голос в течение длительного времени, могут использовать высокопроизводительную блокировку Wi-Fi, чтобы обеспечить производительность потоковой передачи, даже когда экран выключен. Поскольку при этом потребляется больше энергии, приложения должны использовать высокопроизводительный Wi-Fi, когда есть необходимость в длительном активном подключении.
- Дополнительная статистика по трафику
- Теперь приложения могут получать доступ к статистике по большему количеству типов использования сети с помощью новых методов в
TrafficStats. Приложения могут использовать эти методы, чтобы получать статистику UDP, количество пакетов, а также байты и сегменты полезной нагрузки передачи/приема TCP для заданного UID.
- Теперь приложения могут получать доступ к статистике по большему количеству типов использования сети с помощью новых методов в
- Имя пользователя для аутентификации SIP
- Теперь приложения могут получать и задавать имя пользователя для аутентификации SIP в профиле с помощью новых методов
getAuthUserName()иsetAuthUserName().
- Теперь приложения могут получать и задавать имя пользователя для аутентификации SIP в профиле с помощью новых методов
Диспетчер загрузки
- Обработка завершенных скачиваний.
- Теперь приложения могут инициировать скачивание, уведомляя пользователей только о его завершении. Чтобы инициировать такое скачивание, приложения передают
VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETIONв методеsetNotificationVisibility()объекта запроса. - Новый метод
addCompletedDownload()позволяет приложению добавлять файл в базу данных скачанных файлов, чтобы им можно было управлять в приложении "Скачанные файлы".
- Теперь приложения могут инициировать скачивание, уведомляя пользователей только о его завершении. Чтобы инициировать такое скачивание, приложения передают
- Показать скачанные файлы, отсортированные по размеру.
- Приложения могут запускать приложение "Загрузки" в режиме сортировки по размеру, добавляя новое дополнительное значение
INTENT_EXTRAS_SORT_BY_SIZEк намерениюACTION_VIEW_DOWNLOADS.
- Приложения могут запускать приложение "Загрузки" в режиме сортировки по размеру, добавляя новое дополнительное значение
Фреймворк IME
- Получение ключа дополнительного значения способа ввода
InputMethodSubtypeдобавляет методcontainsExtraValueKey(), чтобы проверить, сохранена ли строка ExtraValue для подтипа, и методgetExtraValueOf(), чтобы извлечь определенное значение ключа из хеш-карты ExtraValue.
Мультимедиа
- Новые форматы потокового аудио
- В медиафреймворк добавлена встроенная поддержка необработанного контента ADTS AAC для улучшения потокового аудио, а также поддержка аудио FLAC для сжатого аудиоконтента высочайшего качества (без потерь). Подробную информацию можно найти в статье Поддерживаемые форматы медиафайлов.
Управление запуском остановленных приложений
Начиная с Android 3.1, системный менеджер пакетов отслеживает приложения, которые находятся в остановленном состоянии, и предоставляет средства для управления их запуском из фоновых процессов и других приложений.
Обратите внимание, что остановленное состояние приложения отличается от остановленного состояния действия. Система управляет этими двумя состояниями остановки отдельно.
Платформа определяет два новых флага intent, которые позволяют отправителю указать, разрешено ли intent активировать компоненты в остановленном приложении.
FLAG_INCLUDE_STOPPED_PACKAGES– включить фильтры интентов остановленных приложений в список потенциальных целей для разрешения.FLAG_EXCLUDE_STOPPED_PACKAGES– исключить фильтры интентов остановленных приложений из списка потенциальных целей.
Если в намерении не указан ни один из этих флагов или указаны оба, то по умолчанию фильтры остановленных приложений включаются в список потенциальных целей.
Обратите внимание, что система добавляет FLAG_EXCLUDE_STOPPED_PACKAGES ко всем намерениям трансляции. Это позволяет предотвратить случайный или ненужный запуск компонентов остановленных приложений из широковещательных рассылок фоновых служб.
Фоновая служба или приложение могут переопределить это поведение, добавив флаг FLAG_INCLUDE_STOPPED_PACKAGES к широковещательным намерениям, которым должно быть разрешено активировать остановленные приложения.
Приложения находятся в остановленном состоянии, когда они только что установлены, но ещё не запущены, а также когда они остановлены пользователем вручную (в разделе "Управление приложениями").
Уведомление о первом запуске и обновлении приложения
В платформу добавлено улучшенное уведомление о первом запуске приложения и обновлениях с помощью двух новых действий intent:
ACTION_PACKAGE_FIRST_LAUNCH– отправляется пакету установщика приложения при первом запуске этого приложения (то есть когда оно впервые выходит из остановленного состояния). Данные содержат название пакета.ACTION_MY_PACKAGE_REPLACED– уведомляет приложение о том, что оно было обновлено и новая версия была установлена поверх существующей. Оно отправляется только в приложение, которое было заменено. Дополнительные данные в нем отсутствуют. Чтобы получать его, объявите фильтр интентов для этого действия. Вы можете использовать намерение, чтобы запустить код, который поможет вернуть приложение в рабочее состояние после обновления.Это намерение отправляется непосредственно в приложение, но только если оно было обновлено в запущенном состоянии (не в остановленном).
Основные утилиты
- Кеш LRU
- Новый класс
LruCacheпозволяет приложениям использовать эффективное кеширование. Приложения могут использовать этот класс, чтобы сократить время, затрачиваемое на вычисления или скачивание данных из сети, сохраняя при этом разумный объем потребляемой памяти для кешированных данных.LruCache– это кеш, который содержит строгие ссылки на ограниченное количество значений. Каждый раз, когда происходит обращение к значению, оно перемещается в начало очереди. Когда в заполненный кеш добавляется новое значение, значение в конце очереди удаляется и может быть удалено сборщиком мусора.
- Новый класс
- Дескриптор файла как
int- Теперь вы можете получить дескриптор нативного файла int для
ParcelFileDescriptor, используя любой из новых методов:getFd()илиdetachFd().
- Теперь вы можете получить дескриптор нативного файла int для
WebKit
- Файлы cookie для схем файлов
- Теперь
CookieManagerподдерживает файлы cookie, в которых используется схема URIfile:. Вы можете использоватьsetAcceptFileSchemeCookies(), чтобы включить или отключить поддержку файлов cookie со схемой file, прежде чем создавать экземплярWebViewилиCookieManager. В экземпляреCookieManagerможно проверить, включены ли файлы cookie для схемы file, вызвав методallowFileSchemeCookies().
- Теперь
- Уведомление о запросе на вход
- Для поддержки функций автоматического входа в браузер, представленных в Android 3.0, новый метод
onReceivedLoginRequest()уведомляет хост-приложение о том, что запрос на автоматический вход для пользователя был обработан.
- Для поддержки функций автоматического входа в браузер, представленных в Android 3.0, новый метод
- Удаленные классы и интерфейсы
- Из общедоступного API удалены несколько классов и интерфейсов, которые ранее были помечены как устаревшие. Подробную информацию можно найти в отчете о различиях в API.
Браузер
Приложение Browser добавляет следующие функции для поддержки веб-приложений:
- Поддержка встроенного проигрывателя для видео, размещенного в теге
<video>HTML5. По возможности используется аппаратное ускорение. - Поддержка слоев для элементов с фиксированным положением на всех сайтах (для мобильных устройств и компьютеров).
Константы новых функций
В платформу добавлены новые константы аппаратных функций, которые разработчики могут объявлять в манифестах своих приложений, чтобы информировать внешние объекты, такие как Google Play, о требованиях приложения к новым аппаратным возможностям, поддерживаемым в этой версии платформы. Разработчики объявляют эти и другие константы функций в элементах манифеста <uses-feature>.
android.hardware.usb.accessory– приложение использует USB API для взаимодействия с внешними аппаратными устройствами, подключенными через USB и работающими в качестве хостов.android.hardware.usb.host– приложение использует USB API для обмена данными с внешними аппаратными устройствами, подключенными через USB, и работает как устройство.
Google Play фильтрует приложения на основе функций, заявленных в элементах манифеста <uses-feature>. Подробнее о том, как объявлять функции в манифесте приложения, читайте в разделе Google Play Filters.
Отчет о различиях в API
Подробные сведения обо всех изменениях API в Android 3.1 (уровень API 12) приведены в отчете о различиях API.
Уровень API
Платформа Android 3.1 содержит обновленную версию API фреймворка. API Android 3.1 присвоен целочисленный идентификатор 12, который хранится в самой системе. Этот идентификатор, называемый уровнем API, позволяет системе правильно определить, совместимо ли приложение с системой, до установки приложения.
Чтобы использовать в приложении API, представленные в Android 3.1, необходимо скомпилировать приложение с библиотекой Android, которая предоставляется на платформе Android 3.1 SDK. В зависимости от ваших потребностей вам также может потребоваться добавить атрибут android:minSdkVersion="12" в элемент <uses-sdk> в манифесте приложения.
Подробнее об уровнях API…