Уровень API: 12
Для разработчиков платформа Android 3.1 ( HONEYCOMB_MR1
) доступна в виде загружаемого компонента для Android SDK. Загружаемая платформа включает в себя библиотеку Android и образ системы, а также набор скинов эмулятора и многое другое. Загружаемая платформа не содержит внешних библиотек.
Для разработчиков платформа Android 3.1 доступна в виде загружаемого компонента Android SDK. Загружаемая платформа включает в себя библиотеку Android и образ системы, а также набор скинов эмулятора и многое другое. Чтобы начать разработку или тестирование для Android 3.1, используйте Android SDK Manager, чтобы загрузить платформу в свой SDK.
Обзор 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
также объявляет действия о намерениях, которые транслирует система, чтобы сообщить, когда 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-аксессуарами, можно найти в документации разработчика .
Чтобы просмотреть примеры приложений, использующих API USB-хоста, см. ADB Test and Missile Launcher.
API МТР/ПТП
В Android 3.1 представлен новый API MTP, который позволяет приложениям напрямую взаимодействовать с подключенными камерами и другими устройствами PTP. Новый API позволяет приложению легко получать уведомления при подключении и удалении устройств, управлять файлами и хранилищем на этих устройствах, а также передавать файлы и метаданные на них и обратно. MTP API реализует подмножество PTP (протокол передачи изображений) спецификации MTP (протокол передачи мультимедиа).
API MTP доступен в пакете 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_BUTTON
-
SOURCE_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 (транспортный протокол реального времени), который приложения могут использовать для управления потоковой передачей данных по требованию или в интерактивном режиме. В частности, приложения, которые обеспечивают VOIP, PTT, конференц-связь и потоковое аудио, могут использовать API для инициации сеансов и передачи или получения потоков данных по любой доступной сети.
API RTP доступен в пакете android.net.rtp
. Занятия включают в себя:
-
RtpStream
— базовый класс потоков, которые отправляют и получают сетевые пакеты с полезными данными мультимедиа через RTP. -
AudioStream
— подклассRtpStream
, который передает аудиополезные данные через RTP. -
AudioGroup
— локальный аудиохаб для управления и микширования динамика устройства, микрофона иAudioStream
. -
AudioCodec
, который содержит коллекцию кодеков, которые вы определяете дляAudioStream
.
Для поддержки аудиоконференций и подобных применений приложение создает экземпляры двух классов в качестве конечных точек потока:
-
AudioStream
указывает удаленную конечную точку и состоит из сопоставления сети и настроенногоAudioCodec
. -
AudioGroup
представляет локальную конечную точку для одного или несколькихAudioStream
s.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».
Вот пример:
<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()
позволяет приложению принудительно создать слой представления и немедленно отобразить представление в нем. Например, приложение может использовать этот метод для рендеринга представления в его слой перед запуском анимации. Если представление сложное, его рендеринг в слой перед запуском анимации позволит избежать пропуска кадров.
- Новый метод
- Расстояние камеры
- Приложения могут использовать новый метод
setCameraDistance(float)
для установки расстояния от камеры до представления. Это дает приложениям улучшенный контроль над трехмерными преобразованиями представления, такими как повороты.
- Приложения могут использовать новый метод
- Получение представления календаря из DatePicker
- Новый метод
getCalendarView()
позволяет получитьCalendarView
из экземпляраDatePicker
.
- Новый метод
- Получение обратных вызовов при отсоединении представлений
- Новый
View.OnAttachStateChangeListener
позволяет получать обратные вызовы, когда представление прикрепляется к окну или отсоединяется от него. ИспользуйтеaddOnAttachStateChangeListener()
, чтобы добавить прослушиватель, иaddOnAttachStateChangeListener()
чтобы удалить его.
- Новый
- Прослушиватель хлебных крошек фрагмента, новая подпись onInflate()
- Новый метод
setOnBreadCrumbClickListener()
предоставляет возможность приложениям перехватывать щелчки по фрагментам и выполнять любые необходимые действия перед переходом к записи backstack или фрагменту, по которому был сделан щелчок. - В классе
Fragment
onInflate(attrs, savedInstanceState)
устарел. Вместо этого используйтеonInflate(activity, attrs, savedInstanceState)
.
- Новый метод
- Отобразить результат поиска в новой вкладке
- Ключ данных
EXTRA_NEW_SEARCH
для намеренийACTION_WEB_SEARCH
позволяет открыть поиск в новой вкладке браузера, а не в существующей.
- Ключ данных
- Рисуемый текстовый курсор
- Теперь вы можете указать объект рисования, который будет использоваться в качестве текстового курсора, используя новый атрибут ресурса
textCursorDrawable
.
- Теперь вы можете указать объект рисования, который будет использоваться в качестве текстового курсора, используя новый атрибут ресурса
- Настройка отображаемого дочернего элемента в удаленных представлениях
- В подклассах
RemoteViews
доступен новый удобный методsetDisplayedChild(viewId, childIndex)
, позволяющий установить дочерний элемент, отображаемый в подклассахViewAnimator
иAdapterViewAnimator
, таких какAdapterViewFlipper
,StackView
,ViewFlipper
иViewSwitcher
.
- В подклассах
- Универсальные клавиши для геймпадов и других устройств ввода
-
KeyEvent
добавляет ряд общих кодов клавиш для кнопок геймпада. Класс также добавляетisGamepadButton(int)
и несколько других вспомогательных методов для работы с кодами клавиш.
-
Графика
- Помощники для управления растровыми изображениями
-
setHasAlpha(boolean)
позволяет приложению указать, что все пиксели в растровом изображении непрозрачны (ложь) или что некоторые из пикселей могут содержать непрозрачные альфа-значения (истина). Обратите внимание: для некоторых конфигураций (например, RGB_565) этот вызов игнорируется, поскольку он не поддерживает попиксельные альфа-значения. Это задумано как подсказка для рисования, поскольку в некоторых случаях растровое изображение, которое, как известно, является непрозрачным, может обрабатываться быстрее, чем то, которое может иметь непрозрачные значения альфа для каждого пикселя. -
getByteCount()
получает размер растрового изображения в байтах. -
getGenerationId()
позволяет приложению узнать, было ли изменено растровое изображение, например, для кэширования. -
sameAs(android.graphics.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, системный менеджер пакетов отслеживает приложения, находящиеся в остановленном состоянии, и предоставляет средства контроля их запуска из фоновых процессов и других приложений.
Обратите внимание, что состояние остановки приложения — это не то же самое, что состояние остановки действия. Система управляет этими двумя остановленными состояниями отдельно.
Платформа определяет два новых флага намерения, которые позволяют отправителю указать, разрешено ли намерению активировать компоненты в остановленном приложении.
-
FLAG_INCLUDE_STOPPED_PACKAGES
— включить фильтры намерений остановленных приложений в список потенциальных целей для разрешения. -
FLAG_EXCLUDE_STOPPED_PACKAGES
— исключить фильтры намерений остановленных приложений из списка потенциальных целей.
Если ни один из этих флагов или оба не определены в намерении, поведением по умолчанию является включение фильтров остановленных приложений в список потенциальных целей.
Обратите внимание, что система добавляет FLAG_EXCLUDE_STOPPED_PACKAGES
ко всем широковещательным намерениям . Это делается для предотвращения непреднамеренного или ненужного запуска компонентов остановленных приложений широковещательными сообщениями фоновых служб. Фоновая служба или приложение могут переопределить это поведение, добавив флаг FLAG_INCLUDE_STOPPED_PACKAGES
к широковещательным намерениям, которым должно быть разрешено активировать остановленные приложения.
Приложения находятся в остановленном состоянии, когда они впервые установлены, но еще не запущены, а также когда они вручную остановлены пользователем (в разделе «Управление приложениями»).
Уведомление о первом запуске и обновлении приложения
Платформа добавляет улучшенное уведомление о первом запуске приложения и обновлениях с помощью двух новых действий по намерению:
-
ACTION_PACKAGE_FIRST_LAUNCH
— отправляется в установочный пакет приложения при первом запуске этого приложения (то есть при первом выходе его из остановленного состояния). Данные содержат имя пакета. -
ACTION_MY_PACKAGE_REPLACED
— уведомляет приложение о том, что оно было обновлено, причем новая версия была установлена поверх существующей. Это отправляется только в приложение, которое было заменено. Он не содержит никаких дополнительных данных. Чтобы его получить, объявите фильтр намерений для этого действия. Вы можете использовать намерение для запуска кода, который поможет вернуть вашему приложению работоспособность после обновления.Это намерение отправляется непосредственно приложению, но только в том случае, если приложение было обновлено, когда оно находилось в запущенном состоянии (а не в остановленном).
Основные утилиты
- LRU-кэш
- Новый класс
LruCache
позволяет вашим приложениям эффективно кэшировать. Приложения могут использовать этот класс, чтобы сократить время, затрачиваемое на вычисления или загрузку данных из сети, сохраняя при этом разумный объем памяти для кэшированных данных.LruCache
— это кеш, который содержит сильные ссылки на ограниченное количество значений. При каждом доступе к значению оно перемещается в начало очереди. Когда значение добавляется в полный кэш, значение в конце этой очереди вытесняется и может стать пригодным для сборки мусора.
- Новый класс
- Дескриптор файла как
int
- Теперь вы можете получить собственный файловый дескриптор int для
ParcelFileDescriptor
, используя любой из новых методовgetFd()
илиdetachFd()
.
- Теперь вы можете получить собственный файловый дескриптор int для
Вебкит
- Файловая схема файлов cookie
-
CookieManager
теперь поддерживает файлы cookie, использующие схемуfile:
URI. Вы можете использоватьsetAcceptFileSchemeCookies()
чтобы включить/отключить поддержку файлов cookie файловой схемы перед созданием экземпляраWebView
илиCookieManager
. В экземпляреCookieManager
вы можете проверить, включены ли файлы cookie файловой схемы, вызвавallowFileSchemeCookies()
.
-
- Уведомление о запросе на вход
- Для поддержки функций автоматического входа в браузер, представленных в Android 3.0, новый метод
onReceivedLoginRequest()
уведомляет ведущее приложение о том, что запрос на автоматический вход пользователя был обработан.
- Для поддержки функций автоматического входа в браузер, представленных в Android 3.0, новый метод
- Удалены классы и интерфейсы
- Несколько классов и интерфейсов были удалены из общедоступного API, поскольку ранее они находились в устаревшем состоянии. Дополнительную информацию см. в отчете о различиях API .
Браузер
Приложение браузера добавляет следующие функции для поддержки веб-приложений:
- Поддержка встроенного воспроизведения видео, встроенного в тег HTML5
<video>
. Воспроизведение, где это возможно, ускоряется аппаратно. - Поддержка слоев для элементов с фиксированным положением для всех сайтов (мобильных и настольных).
Новые константы функций
Платформа добавляет новые константы аппаратных функций, которые разработчики могут объявлять в манифестах своих приложений, чтобы информировать внешние объекты, такие как Google Play, о требованиях приложения к новым аппаратным возможностям, поддерживаемым в этой версии платформы. Разработчики объявляют эти и другие константы функций в элементах манифеста <uses-feature>
.
-
android.hardware.usb.accessory
— приложение использует USB API для связи с внешними аппаратными устройствами, подключенными через USB, и функционирует в качестве хостов. -
android.hardware.usb.host
— приложение использует USB API для связи с внешними аппаратными устройствами, подключенными через USB, и функционирует как устройства.
Google Play фильтрует приложения на основе функций, объявленных в элементах манифеста <uses-feature>
. Дополнительные сведения об объявлении функций в манифесте приложения см. в разделе Фильтры Google Play .
Отчет о различиях 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?».