Уровень API: 11.
Платформа Android 3.0 (HONEYCOMB) доступна разработчикам в виде скачиваемого компонента для Android SDK. Скачиваемая платформа включает библиотеку Android, образ системы, набор обложек эмулятора и т. д. Скачиваемая платформа не включает внешние библиотеки.
Для разработчиков платформа Android 3.0 доступна в виде скачиваемого компонента Android SDK. Скачиваемая платформа включает библиотеку Android, образ системы, набор обложек эмулятора и т. д. Чтобы начать разработку или тестирование для Android 3.0, скачайте платформу в SDK с помощью Android SDK Manager.
Общие сведения об API
В разделах ниже приведен технический обзор новых возможностей для разработчиков в Android 3.0, включая новые функции и изменения в API фреймворка по сравнению с предыдущей версией.
Фрагменты
Фрагмент – это новый компонент фреймворка, который позволяет разделять отдельные элементы действия на автономные модули, определяющие собственный пользовательский интерфейс и жизненный цикл. Чтобы создать фрагмент, необходимо расширить класс Fragment и реализовать несколько методов обратного вызова жизненного цикла, аналогично Activity. Вы можете объединить несколько фрагментов в одном действии, чтобы создать многопанельный пользовательский интерфейс, в котором каждая панель управляет своим жизненным циклом и пользовательским вводом.
Вы также можете использовать фрагмент без предоставления пользовательского интерфейса, а вместо этого использовать фрагмент в качестве воркера для действия, например, для управления ходом скачивания, которая происходит только во время выполнения действия.
Вы будете учитывать следующее:
- Фрагменты являются автономными, и их можно повторно использовать в нескольких действиях.
- Вы можете добавлять, удалять, заменять и анимировать фрагменты внутри действия.
- Вы можете добавлять фрагменты в обратный стек, управляемый действием, сохраняя состояние фрагментов по мере их изменения и позволяя пользователю перемещаться назад по различным состояниям.
- Предоставляя альтернативные макеты, вы можете комбинировать фрагменты в зависимости от размера и ориентации экрана.
- Фрагменты имеют прямой доступ к своему контейнеру и могут добавлять элементы на панель действий (см. ниже).
Для управления фрагментами в действии необходимо использовать FragmentManager, который предоставляет несколько API для взаимодействия с фрагментами, например для поиска фрагментов в действии и извлечения фрагментов из обратного стека для восстановления их предыдущего состояния.
Чтобы выполнить транзакцию, например добавить или удалить фрагмент, необходимо создать FragmentTransaction. Затем вы можете вызвать такие методы, как add(), remove() или replace(). После того как вы внесете все необходимые изменения, вызовите метод commit(), чтобы применить транзакцию фрагмента к действию.
Дополнительную информацию об использовании фрагментов можно найти в документации. Несколько примеров также доступно в приложении API Demos.
Панель действий
Панель действий заменяет традиционную строку заголовка в верхней части окна действия. В левом углу панели находится логотип приложения, а в меню параметров – новый интерфейс для элементов. Кроме того, на панели действий можно:
- Добавьте пункты меню непосредственно в панель действий в качестве задач.
В XML-декларации пункта меню укажите атрибут
android:showAsActionсо значением"ifRoom". Если места достаточно, пункт меню появляется непосредственно на панели действий. В противном случае элемент помещается в дополнительное меню, которое открывается при нажатии на значок меню в правой части панели действий. - Заменить элемент действия виджетом (например, окном поиска), создав представление действия.
В XML-декларации для пункта меню добавьте атрибут
android:actionViewLayoutс ресурсом макета или атрибутandroid:actionViewClassс названием класса виджета. (Чтобы элемент появился на панели действий, необходимо также объявить атрибутandroid:showAsAction.) Если на панели действий недостаточно места и элемент появляется в дополнительном меню, он ведет себя как обычный элемент меню и не показывает виджет. - Добавьте действие для логотипа приложения и замените его на собственный логотип
Логотипу приложения автоматически присваивается идентификатор
android.R.id.home, который система передает обратному вызовуonOptionsItemSelected()при нажатии. Просто добавьте этот идентификатор в метод обратного вызова, чтобы выполнить действие, например перейти на главный экран приложения.Чтобы заменить значок логотипом, укажите логотип приложения в файле манифеста с помощью атрибута
android:logo, а затем вызовитеsetDisplayUseLogoEnabled(true)в объекте activity. - Добавьте навигационную цепочку, чтобы перемещаться назад по обратному стеку фрагментов.
- Добавьте вкладки или раскрывающийся список для навигации по фрагментам.
- Настройте панель действий с помощью тем и фонов.
Панель действий является стандартной для всех приложений, использующих новую голографическую тему, которая также является стандартной, если вы установили для android:minSdkVersion или android:targetSdkVersion значение "11".
Дополнительную информацию вы найдете в документации по панели действий. Несколько примеров также доступно в приложении API Demos.
Системный буфер обмена
Теперь приложения могут копировать и вставлять данные (не только текст) в общесистемный буфер обмена и из него. Это может быть обычный текст, URI или намерение.
Предоставив системе доступ к данным, которые пользователь хочет скопировать, через поставщика контента, пользователь может скопировать сложный контент (например, изображение или структуру данных) из вашего приложения и вставить его в другое приложение, поддерживающее этот тип контента.
Чтобы начать работу с буфером обмена, получите глобальный объект ClipboardManager, вызвав getSystemService(CLIPBOARD_SERVICE).
Чтобы скопировать элемент в буфер обмена, необходимо создать новый объект ClipData, который содержит один или несколько объектов ClipData.Item, каждый из которых описывает один объект. Чтобы создать объект ClipData, содержащий только один объект ClipData.Item, можно использовать один из вспомогательных методов, например newPlainText(), newUri() или newIntent(). Каждый из них возвращает объект ClipData, предварительно загруженный с указанным вами объектом ClipData.Item.
Чтобы добавить ClipData в буфер обмена, передайте его в setPrimaryClip() для вашего экземпляра ClipboardManager.
Затем вы можете прочитать файл из буфера обмена (чтобы вставить его), вызвав getPrimaryClip() для ClipboardManager. Обработка полученных данных ClipData может быть сложной, и вам нужно убедиться, что вы действительно можете обработать тип данных в буфере обмена, прежде чем пытаться его вставить.
В буфере обмена может храниться только один фрагмент данных (объект ClipData), но один объект ClipData может содержать несколько объектов ClipData.Item.
Дополнительную информацию можно найти в документации по копированию и вставке. Простой пример реализации копирования и вставки можно найти в примере API Demos, а более полный – в примере Note Pad.
Перетаскивание
Новые API упрощают операции перетаскивания в пользовательском интерфейсе приложения. Операция перетаскивания – это передача данных, содержащихся в объекте ClipData, из одного места в другое. Начальная и конечная точки операции перетаскивания – это View, поэтому API, которые непосредственно обрабатывают операции перетаскивания, находятся в классе View.
Жизненный цикл операции перетаскивания определяется несколькими действиями, каждое из которых задается объектом DragEvent, например ACTION_DRAG_STARTED, ACTION_DRAG_ENTERED и ACTION_DROP. Каждое представление, которое хочет участвовать в операции перетаскивания, может прослушивать эти действия.
Чтобы начать перетаскивание контента в действии, вызовите startDrag() для View, предоставив объект ClipData, который представляет данные для перетаскивания, View.DragShadowBuilder, чтобы облегчить "тень", которую пользователи видят под пальцами во время перетаскивания, и Object, который может делиться информацией о перетаскиваемом объекте с представлениями, которые могут его получить.
Чтобы принять перетаскиваемый объект в View (получить "перетаскивание"), зарегистрируйте представление с помощью OnDragListener, вызвав setOnDragListener(). Когда в представлении происходит событие перетаскивания, система вызывает onDrag() для OnDragListener, который получает DragEvent, описывающий тип произошедшего действия перетаскивания (например, ACTION_DRAG_STARTED, ACTION_DRAG_ENTERED и ACTION_DROP). Во время перетаскивания система повторно вызывает onDrag() для представления под перетаскиванием, чтобы доставить поток событий перетаскивания. Получающее представление может запросить тип события, доставленного в onDragEvent(), вызвав getAction() для DragEvent.
Примечание. Хотя событие перетаскивания может содержать объект ClipData, это не связано с системным буфером обмена. При перетаскивании данные не должны попадать в системный буфер обмена.
Дополнительную информацию можно найти в документации по перетаскиванию. Вы также можете ознакомиться с реализацией перетаскивания в приложениях API Demos и Honeycomb Gallery.
Виджеты приложений
В Android 3.0 поддерживается несколько новых классов виджетов, которые позволяют создавать более интерактивные виджеты приложений на главном экране, в том числе GridView, ListView, StackView, ViewFlipper и AdapterViewFlipper.
Но самое главное – вы можете использовать новый RemoteViewsService для создания виджетов приложений с коллекциями, используя такие виджеты, как GridView, ListView и StackView, которые поддерживаются удаленными данными, например от поставщика контента.
Класс AppWidgetProviderInfo (определенный в XML с элементом <appwidget-provider>) также поддерживает два новых поля: autoAdvanceViewId и previewImage. Поле autoAdvanceViewId позволяет указать идентификатор представления дочернего представления виджета приложения, которое должно автоматически продвигаться хостом виджета приложения. Поле previewImage определяет, как будет выглядеть виджет приложения в окне выбора виджетов. Если это поле не заполнено, в качестве предварительного изображения используется значок виджета.
Чтобы создать изображение для предварительного просмотра виджета приложения (которое указывается в поле previewImage), в эмуляторе Android есть приложение Widget Preview. Чтобы создать изображение для предварительного просмотра, запустите это приложение, выберите виджет для своего приложения и настройте его так, как должно выглядеть изображение для предварительного просмотра, а затем сохраните его и поместите в прорисовываемые ресурсы приложения.
Примеры реализации новых функций виджетов приложений можно посмотреть в приложениях StackView App Widget и Weather List Widget.
Уведомления в строке состояния
API Notification были расширены для поддержки более информативных уведомлений в строке состояния, а новый класс Notification.Builder позволяет легко создавать объекты Notification.
Что нового:
- Поддержка большого значка в уведомлении с помощью
setLargeIcon(). Обычно это используется в социальных приложениях, чтобы показать фото контакта, от которого пришло уведомление, или в мультимедийных приложениях, чтобы показать значок альбома. - Поддержка пользовательских макетов в бегущей строке состояния с помощью
setTicker(). - Добавлена поддержка специальных макетов уведомлений, позволяющих включать кнопки с
PendingIntentдля более интерактивных виджетов уведомлений. Например, уведомление может управлять воспроизведением музыки без запуска действия.
Загрузчики контента
Новые API фреймворка упрощают асинхронную загрузку данных с помощью класса Loader. Его можно использовать в сочетании с компонентами пользовательского интерфейса, такими как представления и фрагменты, для динамической загрузки данных из рабочих потоков. Подкласс CursorLoader специально разработан для того, чтобы помочь вам сделать это для данных, поддерживаемых ContentProvider.
Вам нужно лишь реализовать интерфейс LoaderCallbacks, чтобы получать обратные вызовы при запросе нового загрузчика или изменении данных, а затем вызвать initLoader(), чтобы инициализировать загрузчик для вашего действия или фрагмента.
Дополнительную информацию можно найти в документации по загрузчикам. Примеры кода с использованием загрузчиков можно найти в примерах LoaderCursor и LoaderThrottle.
API Bluetooth A2DP и гарнитуры
В Android теперь есть API, позволяющие приложениям проверять состояние подключенных устройств с профилями Bluetooth A2DP и гарнитуры. Например, приложения могут определять, когда для прослушивания музыки подключена Bluetooth-гарнитура, и уведомлять об этом пользователя. Приложения также могут получать широковещательные сообщения для AT-команд, относящихся к поставщику, и уведомлять пользователя о состоянии подключенного устройства, например о низком заряде батареи.
Вы можете инициализировать соответствующий объект BluetoothProfile, вызвав метод getProfileProxy() с константой профиля A2DP или HEADSET и объектом BluetoothProfile.ServiceListener, чтобы получать обратные вызовы при подключении или отключении клиента Bluetooth.
Фреймворк анимации
Новый гибкий фреймворк анимации позволяет анимировать произвольные свойства любого объекта (View, Drawable, Fragment, Object и т. д.). Он позволяет определить несколько аспектов анимации, например:
- Продолжительность
- Количество повторов и поведение
- Тип интерполяции времени
- Наборы аниматора для одновременного или последовательного воспроизведения анимаций, а также для воспроизведения с задержкой.
- Задержка обновления кадра
По умолчанию вы можете задать эти и другие аспекты анимации для целочисленных, плавающих и шестнадцатеричных значений цвета объекта. Это значит, что если у объекта есть поле свойства для одного из этих типов, вы можете со временем изменить его значение, чтобы повлиять на анимацию. Чтобы анимировать любой другой тип значения, вы сообщаете системе, как рассчитать значения для этого заданного типа, реализовав интерфейс TypeEvaluator.
Для анимации значений свойства можно использовать два аниматора: ValueAnimator и ObjectAnimator. ValueAnimator вычисляет значения анимации, но не знает, какой конкретно объект или свойство анимируется в результате. Он просто выполняет вычисления, а вы должны прослушивать обновления и обрабатывать данные с помощью собственной логики. ObjectAnimator – это подкласс ValueAnimator, который позволяет задать объект и свойство для анимации и обрабатывает все действия, связанные с анимацией.
То есть вы передаете ObjectAnimator объект для анимации, свойство объекта, которое должно изменяться со временем, и набор значений, которые должны применяться к свойству со временем, а затем запускаете анимацию.
Кроме того, класс LayoutTransition позволяет автоматически анимировать переходы при изменении макета действия. Чтобы включить переходы для части макета, создайте объект LayoutTransition и задайте его для любого объекта ViewGroup, вызвав метод setLayoutTransition(). Это приводит к запуску анимации по умолчанию при добавлении или удалении элементов из группы. Чтобы задать собственную анимацию, вызовите метод setAnimator() для объекта LayoutTransition и укажите собственный объект Animator, например ValueAnimator или ObjectAnimator, как описано выше.
Дополнительную информацию можно найти в документации по анимации свойств. Вы также можете посмотреть несколько примеров использования API анимации в приложении API Demos.
Расширенный фреймворк пользовательского интерфейса
- Выбор нескольких элементов в ListView и GridView
Новый режим
CHOICE_MODE_MULTIPLE_MODALдляsetChoiceMode()позволяет пользователям выбирать несколько элементов изListViewилиGridView. В сочетании с панелью действий это позволяет пользователям выбирать несколько элементов, а затем выбирать действие, которое нужно выполнить, из списка параметров на панели действий (которая превратилась в режим действий с множественным выбором).Чтобы включить выбор нескольких вариантов, вызовите
setChoiceMode(CHOICE_MODE_MULTIPLE_MODAL)и зарегистрируйтеMultiChoiceModeListenerс помощьюsetMultiChoiceModeListener().Когда пользователь долго нажимает на элемент, панель действий переключается в режим множественного выбора. Система уведомляет
MultiChoiceModeListenerо выборе элементов, вызываяonItemCheckedStateChanged().Пример выбора нескольких вариантов можно найти в классе List15.java в примере приложения API Demos.
- Новые API для преобразования представлений
Новые API позволяют легко применять 2D- и 3D-преобразования к представлениям в макете действия. Новые преобразования стали возможны благодаря набору свойств объекта, которые определяют положение макета, ориентацию, прозрачность и другие параметры.
Новые методы для настройки свойств просмотра:
setAlpha(),setBottom(),setLeft(),setRight(),setBottom(),setPivotX(),setPivotY(),setRotationX(),setRotationY(),setScaleX(),setScaleY(),setAlpha()и другие.У некоторых методов также есть соответствующий атрибут XML, который можно указать в файле макета, чтобы применить преобразование по умолчанию. Доступные атрибуты:
translationX,translationY,rotation,rotationX,rotationY,scaleX,scaleY,transformPivotX,transformPivotYиalpha.Используя некоторые из этих новых свойств представления в сочетании с новой структурой анимации (описанной выше), вы можете легко применять к своим представлениям некоторые необычные анимации. Например, чтобы повернуть представление по оси Y, передайте в
ObjectAnimatorсвойствоView("rotationY"), а также начальное и конечное значения:Kotlin
ObjectAnimator.ofFloat(myView, "rotationY", 0f, 360f).apply { duration = 2000 start() }
Java
ObjectAnimator animator = ObjectAnimator.ofFloat(myView, "rotationY", 0, 360); animator.setDuration(2000); animator.start();
- Новые голографические темы
Стандартные системные виджеты и общий вид были переработаны и включают новую тему пользовательского интерфейса "голографический". Система применяет новую тему, используя стандартную систему стилей и тем.
Любое приложение, предназначенное для платформы Android 3.0 (для этого нужно задать значение
"11"для параметраandroid:minSdkVersionилиandroid:targetSdkVersion), по умолчанию наследует голографическую тему. Однако если в вашем приложении также применяется собственная тема, она переопределит голографическую тему, если вы не обновите свои стили, чтобы унаследовать голографическую тему.Чтобы применить голографическую тему к отдельным действиям или унаследовать их в собственных определениях тем, используйте одну из нескольких новых тем
Theme.Holo. Если ваше приложение совместимо с версиями Android ниже 3.0 и использует собственные темы, вам следует выбрать тему на основе версии платформы. - Новые виджеты
AdapterViewAnimatorБазовый класс для
AdapterView, который выполняет анимацию при переключении между представлениями.AdapterViewFlipperПростой класс
ViewAnimator, который анимирует переходы между двумя или более добавленными в него представлениями. Одновременно показывается только один ребенок. При необходимости он может автоматически переключаться между дочерними элементами через регулярные интервалы времени.CalendarViewПозволяет пользователям выбирать даты в календаре, нажимая на них, а также прокручивать календарь до нужной даты. Вы можете настроить диапазон дат, доступных в виджете.
ListPopupWindowПривязывается к родительскому представлению и показывает список вариантов, например подсказки при вводе текста в представлении
EditText.NumberPickerПозволяет пользователю выбрать число из заданного диапазона. Виджет представляет собой поле ввода и кнопки со стрелками вверх и вниз для выбора числа. Прикосновение к полю ввода позволяет пользователю прокручивать значения или коснуться еще раз, чтобы напрямую отредактировать текущее значение. Вы также можете сопоставить позиции со строками, чтобы вместо индекса позиции отображалась соответствующая строка.
PopupMenuПоказывает
Menuв модальном всплывающем окне, привязанном к представлению. Всплывающее окно появляется под элементом привязки, если там есть место, или над ним, если места нет. Если IME (экранная клавиатура) виден, всплывающее окно не перекрывает его, пока пользователь не коснется меню.SearchViewПредоставляет окно поиска, которое можно настроить для передачи поисковых запросов в указанное действие и отображения подсказок при поиске (так же, как и в традиционном диалоговом окне поиска). Этот виджет особенно полезен для добавления виджета поиска на панель действий. Подробнее о том, как создать интерфейс поиска…
StackViewПредставление, в котором дочерние элементы отображаются в виде трехмерной стопки. Пользователи могут пролистывать их, как карточки в картотеке.
Графика
- Аппаратное ускорение 2D-графики
Теперь вы можете включить рендеринг OpenGL для своего приложения, задав
android:hardwareAccelerated="true"в элементе<application>манифеста или для отдельных элементов<activity>.Этот флаг помогает приложениям быстрее отрисовывать изображения. Это позволяет сделать анимацию и плавную прокрутку более плавными, а также повысить общую производительность и скорость отклика на действия пользователя.
- Поддержка аппаратного и программного обеспечения
По умолчанию у
Viewнет слоя. Вы можете указать, что представление должно поддерживаться аппаратным или программным слоем, заданным значениямиLAYER_TYPE_HARDWAREиLAYER_TYPE_SOFTWARE, с помощьюsetLayerType()или атрибутаlayerType.Аппаратный слой поддерживается текстурой, зависящей от аппаратного обеспечения (обычно это объекты буфера кадров или FBO на оборудовании OpenGL), и заставляет представление отображаться с использованием конвейера аппаратного рендеринга Android, но только если для иерархии View включено аппаратное ускорение. Если аппаратное ускорение отключено, аппаратные слои ведут себя точно так же, как программные.
Программный слой поддерживается растровым изображением и заставляет представление отображаться с использованием конвейера программного рендеринга Android, даже если аппаратное ускорение включено. Не используйте программные слои, если дерево представлений часто обновляется. Каждое обновление потребует повторного рендеринга программного слоя, что может быть медленным.
Дополнительную информацию можно найти в документации по
LAYER_TYPE_HARDWAREиLAYER_TYPE_SOFTWARE. - Движок трехмерной графики Renderscript
Renderscript – это среда выполнения 3D, которая предоставляет API для создания 3D-сцен, а также специальный независимый от платформы язык шейдеров для максимальной производительности. С помощью Renderscript можно ускорить обработку графики и данных. RenderScript – идеальный способ создания высокопроизводительных 3D-эффектов для приложений, обоев, каруселей и т. д.
Подробную информацию вы найдете в документации по 3D-рендерингу и вычислениям с помощью Renderscript.
Мультимедиа
- Ускоренное видео
API видеокамеры теперь поддерживают запись ускоренного видео.
setCaptureRate()задает частоту кадров. - Поддержка текстур для потоков изображений
Новый класс
SurfaceTextureпозволяет захватывать поток изображений в виде текстуры OpenGL ES. Вызывая методsetPreviewTexture()для экземпляраCamera, вы можете указать объектSurfaceTexture, на котором будет воспроизводиться видео или показываться кадры предварительного просмотра с камеры. - HLS : потоковая передача данных по HTTP
Теперь приложения могут передавать URL плейлиста M3U в медиафреймворк, чтобы начать сеанс потоковой передачи данных по HTTP. Фреймворк поддерживает большинство спецификаций HTTP Live Streaming, включая адаптивный битрейт. Подробную информацию можно найти в статье Поддерживаемые мультимедийные форматы.
- Данные EXIF
В
ExifInterfaceдобавлены новые поля для диафрагмы, ISO и выдержки. - Профили видеокамер
Новый метод
hasProfile()и несколько профилей качества видео (например,QUALITY_1080P,QUALITY_720P,QUALITY_CIFи т. д.) позволяют задавать параметры качества видеокамеры. - Передача цифровых медиафайлов
Платформа включает встроенную поддержку протоколов Media/Picture Transfer Protocol (MTP/PTP) через USB, что позволяет пользователям легко передавать любые типы медиафайлов между устройствами и на хост-компьютер. Разработчики могут использовать эту поддержку, создавая приложения, которые позволяют пользователям создавать мультимедийные файлы и управлять ими, а также передавать их на другие устройства.
- Технологии управления цифровыми правами (DRM)
Новая расширяемая платформа управления цифровыми правами (DRM) для проверки и обеспечения соблюдения цифровых прав. Она реализована на двух архитектурных уровнях:
- API фреймворка DRM, который доступен приложениям и выполняется через виртуальную машину Dalvik для стандартных приложений.
- Менеджер DRM нативного кода, который реализует API фреймворка и предоставляет интерфейс для плагинов DRM, чтобы управлять правами и расшифровкой для различных схем DRM.
Разработчикам приложений фреймворк предлагает абстрактный унифицированный API, который упрощает управление защищенным контентом. API скрывает сложность операций DRM и обеспечивает согласованный режим работы как для защищенного, так и для незащищенного контента, а также для различных схем DRM.
Производители устройств, владельцы контента и поставщики цифровых медиа могут использовать API плагина DRM, чтобы добавить в систему Android поддержку выбранной схемы DRM и обеспечить надежную защиту контента.
В предварительном выпуске нет встроенных плагинов технологий DRM для проверки и применения цифровых прав. Однако производители устройств могут поставлять плагины DRM вместе со своими устройствами.
Все API DRM можно найти в пакете
android.drm.
Поддержка клавиатуры
- Поддержка модификаторов Control, Meta, Caps Lock, Num Lock и Scroll Lock. Дополнительную информацию вы найдете в описании поля
META_CTRL_ONи связанных с ним полей. - Поддержка полноразмерных клавиатур, включая клавиши Escape, Home, End, Delete и другие. Чтобы определить, поступают ли ключевые события с полной клавиатуры, запросите
getKeyboardType()и проверьтеKeyCharacterMap.FULL. - В
TextViewтеперь поддерживаются сочетания клавиш для вырезания, копирования, вставки и выделения всего текста: Ctrl + X, Ctrl + C, Ctrl + V и Ctrl + A. Также поддерживаются клавиши PageUp/PageDown, Home/End и выделение текста с помощью клавиатуры. - В
KeyEventдобавлено несколько новых методов, которые упрощают проверку состояния клавиш-модификаторов. См.hasModifiers(int),hasNoModifiers(),metaStateHasModifiers(),metaStateHasNoModifiers(). - Приложения могут использовать собственные сочетания клавиш, если создать подкласс
Activity,DialogилиViewи реализоватьonKeyShortcut(). Фреймворк вызывает этот метод, когда клавиша нажимается вместе с клавишей Control. При создании меню параметров вы можете зарегистрировать быстрые клавиши, задав атрибутandroid:alphabeticShortcutилиandroid:numericShortcutдля каждого элемента<item>(или с помощьюsetShortcut()). - В Android 3.0 добавлено новое устройство "виртуальная клавиатура" с идентификатором
KeyCharacterMap.VIRTUAL_KEYBOARD. Виртуальная клавиатура имеет раскладку, аналогичную раскладке клавиатуры для настольных ПК, что позволяет синтезировать события нажатия клавиш для тестирования ввода.
Разделение событий касания
Раньше события касания могли одновременно обрабатываться только в одном представлении. В Android 3.0 добавлена поддержка разделения событий касания между представлениями и даже окнами, поэтому разные представления могут принимать одновременные события касания.
Разделение событий касания включено по умолчанию, если приложение предназначено для Android 3.0. Это происходит, когда приложение присваивает атрибуту android:minSdkVersion или android:targetSdkVersion значение "11".
Однако следующие свойства позволяют отключить разделение событий касания между представлениями в определенных группах представлений и между окнами.
- Атрибут
android:splitMotionEventsдля групп представлений позволяет отключить раздельные события касания, которые происходят между дочерними представлениями в макете. Пример:<LinearLayout android:splitMotionEvents="false" ... > ... </LinearLayout>Таким образом, дочерние представления в линейном макете не могут разделять события касания – только одно представление может получать события касания за раз.
- Свойство стиля
android:windowEnableSplitTouchпозволяет отключить разделение событий касания между окнами. Его можно применить к теме действия или всего приложения. Пример:<style name="NoSplitMotionEvents" parent="android:Theme.Holo"> <item name="android:windowEnableSplitTouch">false</item> ... </style>Если эта тема применяется к
<activity>или<application>, принимаются только события касания в текущем окне действия. Например, если отключить разделение событий касания между окнами, системная строка не сможет получать события касания одновременно с действием. Это не влияет на то, могут ли представления внутри действия разделять события касания. По умолчанию действие может разделять события касания между представлениями.Подробнее о том, как создать тему…
WebKit
- Новый класс
WebViewFragmentдля создания фрагмента, состоящего изWebView. - Новые методы
WebSettings:setDisplayZoomControls()позволяет скрыть экранные элементы управления масштабом, но при этом пользователь по-прежнему сможет изменять масштаб с помощью жестов (для этого свойствуsetBuiltInZoomControls()должно быть присвоено значениеtrue).- Новый метод
WebSettings(setEnableSmoothTransition()) позволяет включить плавные переходы при панорамировании и масштабировании. Если этот параметр включен, WebView выберет решение, которое позволит максимально повысить производительность (например, контент WebView может не обновляться во время перехода).
- Новые методы
WebView:onPause(), чтобы приостановить обработку, связанную с WebView, когда он становится скрытым. Это позволяет снизить нагрузку на ЦП и уменьшить сетевой трафик, когда WebView не находится на переднем плане.- Обратный вызов
onResume()возобновляет обработку, связанную с WebView, которая была приостановлена во времяonPause(). saveWebArchive()позволяет сохранить текущую страницу в виде веб-архива на устройстве.showFindDialog()– начать текстовый поиск в текущем представлении.
Браузер
Приложение Browser добавляет следующие функции для поддержки веб-приложений:
- Запись экрана
Согласно спецификации HTML Media Capture, браузер позволяет веб-приложениям получать доступ к функциям записи аудио, изображений и видео на устройстве. Например, следующий HTML-код позволяет пользователю сделать снимок и загрузить его:
<input type="file" accept="image/*;capture=camera" />
Если параметр
capture=cameraне указан, пользователь может сделать новый снимок или выбрать изображение на устройстве (например, из галереи). - Ориентация устройства
Согласно спецификации события ориентации устройства, браузер позволяет веб-приложениям прослушивать события DOM, которые предоставляют информацию о физической ориентации и движении устройства.
Ориентация устройства выражается в градусах по осям X, Y и Z, а движение – в данных об ускорении и скорости вращения. Веб-страница может регистрировать события ориентации, вызывая
window.addEventListenerс типом события"deviceorientation", и регистрировать события движения, регистрируя тип события"devicemotion". - 3D-преобразования CSS
Согласно спецификации модуля CSS 3D Transform, браузер позволяет преобразовывать элементы, отрисованные с помощью CSS, в трех измерениях.
Утилиты JSON
Новые классы JsonReader и JsonWriter помогают читать и записывать потоки JSON. Новые API дополняют классы org.json, которые управляют документом в памяти.
Вы можете создать экземпляр JsonReader, вызвав его метод конструктора и передав InputStreamReader, который передает строку JSON.
Затем начните чтение объекта, вызвав beginObject(), прочитайте название ключа с помощью nextName(), прочитайте значение, используя методы, соответствующие типу, например nextString() и nextInt(), и продолжайте делать это, пока hasNext() имеет значение true.
Чтобы создать экземпляр JsonWriter, вызовите его конструктор и передайте соответствующий объект OutputStreamWriter. Затем запишите данные JSON аналогично тому, как это делается в reader, используя name() для добавления имени свойства и соответствующий метод value() для добавления соответствующего значения.
По умолчанию эти классы являются строгими. Метод setLenient() в каждом классе настраивает их так, чтобы они принимали больше данных. Этот режим также совместим с синтаксическим анализатором, который используется в org.json по умолчанию.
Константы новых функций
Элемент манифеста <uses-feature> сообщает внешним объектам (например, Google Play) о наборе аппаратных и программных функций, от которых зависит ваше приложение. В этом выпуске в Android добавлены следующие новые константы, которые приложения могут объявлять с помощью этого элемента:
"android.hardware.faketouch"Если этот элемент объявлен, значит приложение совместимо с устройством, которое предлагает эмулированный сенсорный экран (или лучше). Устройство с эмуляцией сенсорного экрана предоставляет систему ввода, которая может эмулировать часть возможностей сенсорного экрана. Примером такой системы ввода является мышь или пульт дистанционного управления, который управляет экранным курсором. Такие системы ввода поддерживают основные события касания, например нажатие, отпускание и перетаскивание. Однако более сложные типы ввода (например, жесты, пролистывания и т. д.) могут быть затруднены или невозможны на устройствах с имитацией сенсорного экрана (а жесты мультитач точно невозможны).
Если в вашем приложении не используются сложные жесты и вы не хотите, чтобы оно было недоступно на устройствах с эмулируемым сенсорным экраном, объявите
"android.hardware.faketouch"с элементом<uses-feature>. Это позволит сделать приложение доступным для максимального количества типов устройств, включая те, которые поддерживают только эмуляцию сенсорного экрана.Все устройства с сенсорным экраном также поддерживают
"android.hardware.faketouch", поскольку возможности сенсорного экрана являются надмножеством возможностей эмуляции сенсорного экрана. Поэтому, если вам не требуется именно сенсорный экран, добавьте элемент<uses-feature>для faketouch.
Новые разрешения
"android.permission.BIND_REMOTEVIEWS"Оно должно быть объявлено как обязательное в элементе манифеста
<service>для реализацииRemoteViewsService. Например, при создании виджета приложения, который используетRemoteViewsServiceдля заполнения представления коллекции, запись манифеста может выглядеть следующим образом:<service android:name=".widget.WidgetService" android:exported="false" android:permission="android.permission.BIND_REMOTEVIEWS" />
Новые технологии платформы
- Хранилище
- Поддержка файловой системы ext4 для работы со встроенным хранилищем eMMC.
- Файловая система FUSE для поддержки устройств MTP.
- Поддержка режима USB-хоста для подключения клавиатур и USB-концентраторов.
- Поддержка MTP/PTP
- Ядро Linux
- Обновлено до 2.6.36
- Виртуальная машина Dalvik
- Новый код для поддержки и оптимизации SMP
- Улучшения инфраструктуры JIT.
- Улучшения сборщика мусора:
- Настроено для SMP
- Поддержка куч большего размера
- Единая обработка растровых изображений и байтовых буферов
- Dalvik Core Libraries
- Новая, гораздо более быстрая реализация NIO (современной библиотеки ввода-вывода).
- Улучшенные сообщения об исключениях
- Исправлены ошибки и повышена производительность.
Отчет о различиях в API
Подробные сведения обо всех изменениях API в Android 3.0 (уровень API 11) можно найти в отчете о различиях API.
Уровень API
Платформа Android 3.0 содержит обновленную версию API фреймворка. API Android 3.0 присвоен целочисленный идентификатор 11, который хранится в самой системе. Этот идентификатор, называемый уровнем API, позволяет системе правильно определить, совместимо ли приложение с системой, до установки приложения.
Чтобы использовать в приложении API, представленные в Android 3.0, необходимо скомпилировать приложение с библиотекой Android, которая предоставляется в платформе Android 3.0 SDK. В зависимости от ваших потребностей вам также может потребоваться добавить атрибут android:minSdkVersion="11" в элемент <uses-sdk> в манифесте приложения. Если ваше приложение предназначено для работы только на Android 2.3 и более поздних версиях, объявление атрибута предотвращает установку приложения на более ранних версиях платформы.
Подробнее об уровнях API…