API Android 3.0

Уровень API: 11

Для разработчиков платформа Android 3.0 ( HONEYCOMB ) доступна в виде загружаемого компонента для Android SDK. Загружаемая платформа включает в себя библиотеку Android и образ системы, а также набор скинов эмулятора и многое другое. Загружаемая платформа не содержит внешних библиотек.

Для разработчиков платформа Android 3.0 доступна в виде загружаемого компонента Android SDK. Загружаемая платформа включает в себя библиотеку Android и образ системы, а также набор скинов эмулятора и многое другое. Чтобы начать разработку или тестирование для Android 3.0, используйте Android SDK Manager, чтобы загрузить платформу в свой SDK.

Обзор 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) в своей активности.

  • Добавьте хлебные крошки для навигации назад по стопке фрагментов.
  • Добавьте вкладки или раскрывающийся список для навигации по фрагментам.
  • Настройте панель действий с помощью тем и фона.

Панель действий является стандартной для всех приложений, использующих новую голографическую тему, которая также является стандартной, если для параметра 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 и более полную реализацию в примере «Блокнот».

Перетащите

Новые 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 включает приложение под названием «Предварительный просмотр виджета». Чтобы создать изображение предварительного просмотра, запустите это приложение, выберите виджет приложения для своего приложения и настройте его так, как вы хотите, чтобы изображение предварительного просмотра выглядело, затем сохраните его и поместите в доступные для рисования ресурсы вашего приложения.

Вы можете увидеть реализацию новых функций виджета приложения в приложениях StackView App Widget и Weather List Widget .

Уведомления в строке состояния

API-интерфейсы Notification были расширены для поддержки более содержательных уведомлений в строке состояния, а новый класс Notification.Builder позволяет легко создавать объекты Notification .

Новые функции включают в себя:

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

Загрузчики контента

Новые API-интерфейсы платформы облегчают асинхронную загрузку данных с помощью класса Loader . Вы можете использовать его в сочетании с компонентами пользовательского интерфейса, такими как представления и фрагменты, для динамической загрузки данных из рабочих потоков. Подкласс CursorLoader специально разработан, чтобы помочь вам сделать это для данных, поддерживаемых ContentProvider .

Все, что вам нужно сделать, это реализовать интерфейс LoaderCallbacks для получения обратных вызовов при запросе нового загрузчика или изменении данных, а затем вызвать initLoader() , чтобы инициализировать загрузчик для вашего действия или фрагмента.

Для получения дополнительной информации прочтите документацию по загрузчикам . Вы также можете увидеть пример кода с использованием загрузчиков в примерах LoaderCursor и LoaderThrottle .

Bluetooth A2DP и ​​API гарнитуры

Android теперь включает API для приложений для проверки состояния подключенных устройств Bluetooth A2DP и ​​профиля гарнитуры. Например, приложения могут определять, когда для прослушивания музыки подключена Bluetooth-гарнитура, и уведомлять пользователя соответствующим образом. Приложения также могут получать широковещательные рассылки для AT-команд конкретного поставщика и уведомлять пользователя о состоянии подключенного устройства, например, когда батарея подключенного устройства разряжена.

Вы можете инициализировать соответствующий BluetoothProfile , вызвав getProfileProxy() с константой профиля A2DP или HEADSET и BluetoothProfile.ServiceListener для получения обратных вызовов, когда клиент Bluetooth подключается или отключается.

Фреймворк анимации

Совершенно новая гибкая среда анимации позволяет анимировать произвольные свойства любого объекта (представление, рисование, фрагмент, объект или что-либо еще). Он позволяет вам определить несколько аспектов анимации, такие как:

  • Продолжительность
  • Повторите количество и поведение
  • Тип временной интерполяции
  • Аниматор настроен на воспроизведение анимации одновременно, последовательно или после заданных задержек.
  • Задержка обновления кадра

По умолчанию вы можете определить эти и другие аспекты анимации для целых, плавающих и шестнадцатеричных значений цвета объекта. То есть, когда у объекта есть поле свойства для одного из этих типов, вы можете со временем изменять его значение, чтобы повлиять на анимацию. Чтобы анимировать любой другой тип значения, вы сообщаете системе, как вычислять значения для этого заданного типа, реализуя интерфейс 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() . setScaleY() , setAlpha() и другие.

    Некоторые методы также имеют соответствующий атрибут XML, который вы можете указать в файле макета, чтобы применить преобразование по умолчанию. Доступные атрибуты включают: translationX , translationY , rotation , rotationX , rotationY , scaleX , scaleY , transformPivotX , transformPivotY и alpha .

    Используя некоторые из этих новых свойств представления в сочетании с новой инфраструктурой анимации (описанной выше), вы можете легко применить к своим представлениям некоторые необычные анимации. Например, чтобы повернуть представление по оси Y, предоставьте ObjectAnimator View , свойство «rotationY», а также начальное и конечное значения:

    Котлин

    ObjectAnimator.ofFloat(myView, "rotationY", 0f, 360f).apply {
        duration = 2000
        start()
    }

    Ява

    ObjectAnimator animator = ObjectAnimator.ofFloat(myView, "rotationY", 0, 360);
    animator.setDuration(2000);
    animator.start();
  • Новые голографические темы

    Стандартные системные виджеты и общий внешний вид были переработаны и включают новую «голографическую» тему пользовательского интерфейса. Система применяет новую тему, используя стандартную систему стилей и тем .

    Любое приложение, предназначенное для платформы Android 3.0 (установив для параметра android:minSdkVersion или android:targetSdkVersion значение "11" , по умолчанию наследует голографическую тему. Однако если ваше приложение также применяет свою собственную тему, ваша тема будет переопределять голографическую тему, если вы не обновите свои стили, чтобы наследовать голографическую тему.

    Чтобы применить голографическую тему к отдельным действиям или унаследовать ее в собственных определениях тем, используйте одну из нескольких новых тем Theme.Holo . Если ваше приложение совместимо с версией Android ниже 3.0 и использует пользовательские темы, вам следует выбрать тему в зависимости от версии платформы .

  • Новые виджеты
    • AdapterViewAnimator

      Базовый класс для AdapterView , который выполняет анимацию при переключении между представлениями.

    • AdapterViewFlipper

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

    • CalendarView

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

    • ListPopupWindow

      Привязывается к основному представлению и отображает список вариантов, например список предложений при вводе текста в представление EditText .

    • NumberPicker

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

    • PopupMenu

      Отображает Menu в модальном всплывающем окне, привязанном к представлению. Всплывающее окно появляется под видом привязки, если есть место, или над ним, если его нет. Если IME (программная клавиатура) отображается, всплывающее окно не перекрывает IME, пока пользователь не коснется меню.

    • SearchView

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

    • StackView

      Представление, которое отображает дочерние элементы в виде 3D-стека и позволяет пользователям пролистывать представления, как в каталоге.

Графика

  • 2D-графика с аппаратным ускорением

    Теперь вы можете включить средство визуализации OpenGL для своего приложения, установив android:hardwareAccelerated="true" в элементе <application> вашего элемента манифеста или для отдельных элементов <activity> .

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

  • Просмотр поддержки аппаратного и программного уровней

    По умолчанию View не указан слой. Вы можете указать, что представление будет поддерживаться аппаратным или программным уровнем, указанным значениями LAYER_TYPE_HARDWARE и LAYER_TYPE_SOFTWARE , используя setLayerType() или атрибут layerType .

    Аппаратный уровень поддерживается аппаратной текстурой (обычно объектами кадрового буфера или FBO на оборудовании OpenGL) и вызывает рендеринг представления с использованием конвейера аппаратного рендеринга Android, но только если для иерархии представлений включено аппаратное ускорение. Когда аппаратное ускорение отключено, аппаратные уровни ведут себя точно так же, как программные уровни.

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

    Дополнительную информацию см. в документации LAYER_TYPE_HARDWARE и LAYER_TYPE_SOFTWARE .

  • 3D-графический движок Renderscript

    Renderscript — это 3D-фреймворк во время выполнения, который предоставляет как API для создания 3D-сцен, так и специальный, независимый от платформы язык шейдеров для максимальной производительности. Используя Renderscript, вы можете ускорить графические операции и обработку данных. Renderscript — идеальный способ создания высокопроизводительных 3D-эффектов для приложений, обоев, каруселей и многого другого.

    Дополнительные сведения см. в документации по 3D-рендерингу и вычислениям с помощью Renderscript .

СМИ

  • Таймлапс-видео

    API-интерфейсы видеокамер теперь поддерживают возможность записи замедленного видео. Функция setCaptureRate() устанавливает скорость захвата кадров.

  • Поддержка текстур для потоков изображений

    Новая SurfaceTexture позволяет захватывать поток изображений в виде текстуры OpenGL ES. Вызвав setPreviewTexture() для вашего экземпляра Camera , вы можете указать SurfaceTexture , на котором будет рисоваться воспроизведение видео или кадры предварительного просмотра с камеры.

  • HTTP-трансляция в прямом эфире

    Приложения теперь могут передавать URL-адрес списка воспроизведения M3U в медиа-инфраструктуру, чтобы начать сеанс потоковой передачи HTTP Live. Медиа-платформа поддерживает большую часть спецификации потоковой передачи HTTP Live, включая адаптивную скорость передачи данных. Дополнительную информацию см. в документе «Поддерживаемые форматы мультимедиа» .

  • EXIF-данные

    ExifInterface включает новые поля для фотоапертуры, ISO и времени экспозиции.

  • Профили видеокамеры

    Новый метод hasProfile() и несколько профилей качества видео (таких как QUALITY_1080P , QUALITY_720P , QUALITY_CIF и другие) позволяют определять параметры качества видеокамеры.

  • Передача цифровых медиафайлов

    Платформа включает встроенную поддержку протокола передачи мультимедиа/изображений (MTP/PTP) через USB, что позволяет пользователям легко передавать любые типы медиафайлов между устройствами и на главный компьютер. Разработчики могут опираться на эту поддержку, создавая приложения, которые позволяют пользователям создавать мультимедийные файлы или управлять ими, которые они могут захотеть передавать или делиться между устройствами.

  • Управление цифровыми правами (DRM)

    Новая расширяемая структура управления цифровыми правами (DRM) для проверки и обеспечения соблюдения цифровых прав. Он реализован в двух архитектурных слоях:

    • API-интерфейс платформы DRM, который доступен приложениям и запускается через виртуальную машину Dalvik для стандартных приложений.
    • Менеджер DRM с собственным кодом, который реализует API платформы и предоставляет интерфейс для подключаемых модулей DRM для управления правами и расшифровки для различных схем DRM.

    Разработчикам приложений платформа предлагает абстрактный унифицированный API, который упрощает управление защищенным контентом. API скрывает сложность операций DRM и обеспечивает согласованный режим работы как для защищенного, так и для незащищенного контента, а также для различных схем DRM.

    Для производителей устройств, владельцев контента и поставщиков цифровых мультимедиа в Интернете API плагина платформы DRM предоставляет средства добавления поддержки выбранной схемы DRM в систему Android для безопасного обеспечения защиты контента.

    Предварительная версия не содержит никаких собственных подключаемых модулей 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 теперь поддерживает вырезание, копирование, вставку и выбор всего с помощью клавиатуры с помощью комбинаций клавиш Control+X, Control+C, Control+V и Control+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> , принимаются только события касания в текущем окне активности. Например, если отключить разделение событий касания между окнами, системная панель не сможет получать события касания одновременно с действием. Это не влияет на то, могут ли представления внутри действия разделять события касания — по умолчанию действие все равно может разделять события касания между представлениями.

    Дополнительные сведения о создании темы см. в разделе «Применение стилей и тем» .

ВебКит

  • Новый класс WebViewFragment для создания фрагмента, состоящего из WebView .
  • Новые методы WebSettings :
    • setDisplayZoomControls() позволяет скрыть элементы управления масштабированием на экране, в то же время позволяя пользователю масштабировать жестами пальцев ( setBuiltInZoomControls() должно быть установлено true ).
    • Новый метод WebSettings , setEnableSmoothTransition() , позволяет включить плавные переходы при панорамировании и масштабировании. Если этот параметр включен, WebView выберет решение для максимизации производительности (например, содержимое WebView может не обновляться во время перехода).
  • Новые методы WebView :
    • обратный вызов onPause() , чтобы приостановить любую обработку, связанную с WebView, когда он становится скрытым. Это полезно для уменьшения ненужного трафика ЦП или сети, когда WebView не находится на переднем плане.
    • Обратный вызов onResume() для возобновления обработки, связанной с WebView, которая была приостановлена ​​во время onPause() .
    • saveWebArchive() позволяет сохранить текущее представление в виде веб-архива на устройстве.
    • showFindDialog() инициирует текстовый поиск в текущем представлении.

Браузер

Приложение браузера добавляет следующие функции для поддержки веб-приложений:

  • Медиа-захват

    Согласно спецификации HTML Media Capture , браузер позволяет веб-приложениям получать доступ к возможностям захвата аудио, изображений и видео на устройстве. Например, следующий HTML-код предоставляет пользователю входные данные для захвата фотографии и загрузки:

    <input type="file" accept="image/*;capture=camera" />

    Или, исключив параметр capture=camera , пользователь может либо захватить новое изображение с помощью камеры, либо выбрать его на устройстве (например, в приложении «Галерея»).

  • Ориентация устройства

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

    Ориентация устройства выражается с помощью осей x, y и z в градусах, а движение выражается с помощью данных об ускорении и скорости вращения. Веб-страница может регистрироваться для событий ориентации, вызывая window.addEventListener с типом события "deviceorientation" , и регистрироваться для событий движения, регистрируя тип события "devicemotion" .

  • CSS 3D-преобразования

    Согласно спецификации модуля CSS 3D Transform , браузер позволяет трансформировать элементы, отображаемые с помощью CSS, в трех измерениях.

JSON-утилиты

Новые классы JsonReader и JsonWriter помогут вам читать и записывать потоки JSON. Новые API дополняют классы org.json , которые манипулируют документом в памяти.

Вы можете создать экземпляр JsonReader , вызвав его метод конструктора и передав InputStreamReader , который передает строку JSON. Затем начните читать объект, вызвав beginObject() , прочитайте имя ключа с помощью nextName() , прочитайте значение, используя методы, соответствующие типу, такие как nextString() и nextInt() , и продолжайте делать это, пока hasNext() имеет значение true. .

Вы можете создать экземпляр JsonWriter , вызвав его конструктор и передав соответствующий OutputStreamWriter . Затем напишите данные JSON аналогично считывателю, используя name() для добавления имени свойства и соответствующий метод value() для добавления соответствующего значения.

По умолчанию эти классы являются строгими. Метод setLenient() в каждом классе настраивает их более либерально в отношении того, что они принимают. Этот щадящий режим анализа также совместим с синтаксическим анализатором org.json по умолчанию.

Новые константы функций

Элемент манфеста <uses-feature> следует использовать для информирования внешних объектов (таких как Google Play) о наборе аппаратных и программных функций, от которых зависит ваше приложение. В этом выпуске Android добавлены следующие новые константы, которые приложения могут объявлять с помощью этого элемента:

  • "android.hardware.faketouch"

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

    Если ваше приложение не требует сложных жестов и вы не хотите, чтобы ваше приложение фильтровалось от устройств с эмулируемым сенсорным экраном, вам следует объявить "android.hardware.faketouch" с помощью элемента <uses-feature> . Таким образом, ваше приложение будет доступно для наибольшего количества типов устройств, включая те, которые обеспечивают только эмулированный сенсорный ввод.

    Все устройства, которые включают сенсорный экран, также поддерживают "android.hardware.faketouch" , потому что возможности сенсорного экрана являются суперсетем возможностей Faketouch. Таким образом, если вы на самом деле не требуете сенсорного экрана, вы должны добавить элемент <uses-feature> для faketouch.

Новые разрешения

  • "android.permission.BIND_REMOTEVIEWS"

    Это должно быть объявлено как требуемое разрешение в элементе <service> Manifest для реализации RemoteViewsService . Например, при создании виджета приложения, который использует RemoteViewsService для заполнения представления коллекции, манифестная запись может выглядеть следующим образом:

    <service android:name=".widget.WidgetService"
        android:exported="false"
        android:permission="android.permission.BIND_REMOTEVIEWS" />

Новые технологии платформы

  • Хранилище
    • Поддержка файловой системы EXT4 для включения встроенного хранилища EMMC.
    • Файловая система предохранителя для поддержки устройств MTP.
    • Поддержка режима USB -хоста для поддержки клавиатур и USB -концентраторов.
    • Поддержка MTP/PTP
  • Linux ядра
    • Модернизируется до 2,6,36
  • Dalvik VM
    • Новый код для поддержки и оптимизации для SMP
    • Различные улучшения инфраструктуры JIT
    • Улучшения коллекционера мусора:
      • Настраивается на SMP
      • Поддержка больших размеров кучи
      • Объединенная обработка растровых карт и байтовых буферов
  • Далвик основные библиотеки
    • Новая, гораздо быстрая реализация NIO (современная библиотека ввода/вывода)
    • Улучшенные сообщения исключения
    • Правильность и характеристики

Отчет о различиях API

Подробное представление о всех изменениях API в Android 3.0 (API -уровне 11) см. В отчете API различия .

API Уровень

Платформа Android 3.0 обеспечивает обновленную версию Framework 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?