Android 3.0 API

API 级别11

对于开发者,Android 3.0 平台 (HONEYCOMB) 可作为 Android SDK 的可下载组件提供。这个可下载平台包含一个 Android 库和系统映像,以及一组模拟器皮肤等。可下载平台不包含任何外部库。

对于开发者而言,Android 3.0 平台可作为 Android SDK 的可下载组件提供。可下载平台包括一个 Android 库和系统映像,以及一组模拟器皮肤等。要开始针对 Android 3.0 进行开发或测试,请使用 Android SDK 管理器将该平台下载到您的 SDK 中。

API 概览

以下部分从技术方面简要介绍了 Android 3.0 中面向开发者的新变化,包括自上一个版本以来框架 API 中的新功能和变更。

Fragment

fragment 是一种新的框架组件,可让您将 activity 的不同元素拆分成独立的模块,这些模块会定义自己的界面和生命周期。如需创建 fragment,您必须扩展 Fragment 类并实现多个生命周期回调方法,类似于 Activity。然后,您可以将多个 fragment 合并到单个 activity 中来构建多窗格界面,在该界面中,每个窗格管理自己的生命周期和用户输入。

您还可以在不提供界面的情况下使用 fragment,而是将其用作 activity 的工作器,例如,用于管理仅在 activity 运行时发生的下载进度。

此外:

  • fragment 是独立的,您可以在多个 activity 中重复使用它们
  • 您可以在 activity 内添加、移除、替换 fragment,以及为 fragment 添加动画效果
  • 您可以将 fragment 添加到由 activity 管理的返回堆栈,在 fragment 发生更改时保留其状态,并允许用户反向导航不同的状态
  • 通过提供备用布局,您可以根据屏幕尺寸和方向混合搭配 fragment
  • fragment 可以直接访问其容器 activity,并且可以向 activity 的操作栏贡献项(稍后进行介绍)

如需管理 activity 中的 fragment,您必须使用 FragmentManager,它提供了多个用于与 fragment 交互的 API,例如在 activity 中查找 fragment 以及从返回堆栈中弹出 fragment 以恢复其先前状态。

如需执行事务(例如添加或移除 fragment),您必须创建 FragmentTransaction。然后,您可以调用 add()remove()replace() 等方法。应用您想要对事务执行的所有更改之后,您必须调用 commit(),系统会对 Activity 应用 Fragment 事务。

如需详细了解如何使用 fragment,请参阅 fragment 文档。 API 演示应用中还提供了一些示例。

操作栏

操作栏用于替代 Activity 窗口顶部的传统标题栏。该窗口的左上角有一个应用徽标,并为选项菜单中的各个项提供了一个新界面。此外,您还可以使用操作栏执行以下操作:

  • 直接在操作栏中添加菜单项,即“操作项”。

    在菜单项的 XML 声明中,添加值为 "ifRoom"android:showAsAction 属性。当有足够的空间时,菜单项会直接显示在操作栏中。否则,该项会被放置在溢出菜单中,由操作栏右侧的菜单图标显示。

  • 将操作项替换为 widget(例如搜索框)- 创建一个“操作视图”。

    在菜单项的 XML 声明中,添加带有布局资源的 android:actionViewLayout 属性或带有 widget 类名称的 android:actionViewClass 属性。(您还必须声明 android:showAsAction 属性,以便该项显示在操作栏中。)如果操作栏中的空间不足,且该项显示在溢出菜单中,则其行为类似于常规菜单项,并且不会显示 widget。

  • 向应用徽标添加操作,并将其替换为自定义徽标

    系统会自动为应用徽标分配 android.R.id.home ID,当用户触摸时,系统会将该 ID 传递给 activity 的 onOptionsItemSelected() 回调。只需在回调方法中响应此 ID 即可执行转到应用的“主屏幕”Activity 等操作。

    如需使用徽标替换图标,请在清单文件中使用 android:logo 属性指定您的应用徽标,然后在 activity 中调用 setDisplayUseLogoEnabled(true)

  • 添加面包屑导航,以便在 fragment 的返回堆栈中向后导航
  • 添加标签页或下拉列表以在 fragment 之间导航
  • 使用主题和背景自定义操作栏

操作栏是所有使用新的全息主题的应用的标准栏,当您将 android:minSdkVersionandroid:targetSdkVersion 设置为 "11" 时,该全息主题也是标准操作。

如需详细了解操作栏,请参阅操作栏文档。 API 演示应用中还提供了一些示例。

系统剪贴板

应用现在可以将数据(不仅仅是文本)复制和粘贴到系统级剪贴板或从中粘贴数据。裁剪的数据可以是纯文本、URI 或 intent。

通过向系统提供对您希望用户复制的数据的访问权限,用户可以通过 content provider 复制应用中复杂的内容(例如图片或数据结构),并将其粘贴到支持该内容类型的其他应用中。

如需开始使用剪贴板,请通过调用 getSystemService(CLIPBOARD_SERVICE) 获取全局 ClipboardManager 对象。

如需将某个项复制到剪贴板,您需要创建一个新的 ClipData 对象,该对象包含一个或多个 ClipData.Item 对象,每个对象描述一个实体。如需创建仅包含一个 ClipData.ItemClipData 对象,您可以使用一种辅助方法(例如 newPlainText()newUri()newIntent()),每种方法都会返回预加载了您提供的 ClipData.ItemClipData 对象。

如需将 ClipData 添加到剪贴板,请将其传递给 ClipboardManager 实例的 setPrimaryClip()

然后,您可以通过对 ClipboardManager 调用 getPrimaryClip() 来从剪贴板读取文件(以便粘贴该文件)。处理您收到的 ClipData 可能很复杂,您需要确保自己可以实际处理剪贴板中的数据类型,然后再尝试粘贴它。

剪贴板一次只能保留一段剪辑的数据(ClipData 对象),但一个 ClipData 可以包含多个 ClipData.Item

如需了解详情,请阅读复制和粘贴文档。您还可以在 API 演示示例中查看简单的复制和粘贴实现,并在记事本示例中查看更完整的实现。

拖放

新的 API 简化了应用界面中的拖放操作。拖动操作是指将某种类型的数据(携带在 ClipData 对象中)从一个位置传输到另一个位置。拖动操作的起点和终点为 View,因此直接处理拖放操作的 API 位于 View 类中。

拖放操作的生命周期由多个拖动操作定义,每个拖动操作由 DragEvent 对象定义,如 ACTION_DRAG_STARTEDACTION_DRAG_ENTEREDACTION_DROP。想要参与拖动操作的每个视图都可以监听这些操作。

如需开始拖动 activity 中的内容,请对 View 调用 startDrag(),以提供一个表示要拖动的数据的 ClipData 对象、一个方便用户在拖动时看到的“阴影”的 View.DragShadowBuilder,以及一个可与可能接收对象的视图共享拖动对象相关信息的 Object

如需接受 View 中的拖动对象(接收“放下”),请通过调用 setOnDragListener()OnDragListener 注册视图。当视图上发生拖动事件时,系统会为 OnDragListener 调用 onDrag(),后者将接收说明已发生拖动操作类型的 DragEvent(例如 ACTION_DRAG_STARTEDACTION_DRAG_ENTEREDACTION_DROP)。在拖动期间,系统会反复为拖动下面的视图调用 onDrag(),以传递拖动事件流。接收视图可以通过对 DragEvent 调用 getAction() 来查询传递给 onDragEvent() 的事件类型。

注意:尽管拖动事件可能会携带 ClipData 对象,但这与系统剪贴板无关。拖放操作绝不应将拖动的数据放在系统剪贴板中。

如需了解详情,请参阅拖放文档。您还可以在 API Demos 应用和 Honeycomb Gallery 应用中查看拖放实现。

应用微件

Android 3.0 支持为用户主屏幕上显示更具互动性的应用 widget 使用几个新的 widget 类,包括:GridViewListViewStackViewViewFlipperAdapterViewFlipper

更重要的是,您可以利用新的 RemoteViewsService 使用由远程数据(例如来自 content provider)支持的 widget(例如 GridViewListViewStackView)创建包含集合的应用 widget。

AppWidgetProviderInfo 类(在 XML 中使用 <appwidget-provider> 元素定义)还支持两个新字段:autoAdvanceViewIdpreviewImage。借助 autoAdvanceViewId 字段,您可以指定应由应用 widget 的托管应用自动跳转的应用 widget 子视图的视图 ID。previewImage 字段指定应用 widget 的外观预览,并通过 widget 选择器向用户显示。如果未提供此字段,则应用 widget 的图标将用于预览。

为帮助创建应用 widget 的预览映像(要在 previewImage 字段中指定),Android 模拟器包含一个名为“Widget Preview”的应用。如需创建预览图片,请启动此应用,为您的应用选择应用 widget,并设置您想要的预览图片显示方式,然后保存此图片并将其放入应用的可绘制资源中。

您可以在 StackView 应用 widget天气列表 widget 应用中查看新应用 widget 功能的实现。

状态栏通知

Notification API 已经过扩展,可支持更多内容丰富的状态栏通知;此外,通过新的 Notification.Builder 类,您还可以轻松创建 Notification 对象。

新功能包括:

  • 使用 setLargeIcon() 支持在通知中使用大图标。这通常是为了让社交应用显示通知来源者的联系人照片,或让媒体应用显示影集缩略图。
  • 支持使用 setTicker() 在状态栏滚动条中使用自定义布局。
  • 支持自定义通知布局,以包含带有 PendingIntent 的按钮,从而提供更具互动性的通知 widget。例如,通知可以在不启动 activity 的情况下控制音乐播放。

内容加载器

新的框架 API 支持使用 Loader 类异步加载数据。您可以将它与界面组件(如视图和 fragment)结合使用,以从工作器线程动态加载数据。CursorLoader 子类专门用于帮助您针对由 ContentProvider 提供支持的数据执行此操作。

您只需实现 LoaderCallbacks 接口,以便在收到新加载器或数据更改时接收回调,然后调用 initLoader() 为您的 activity 或 fragment 初始化该加载器。

如需了解详情,请阅读加载器文档。您还可以在 LoaderCursor LoaderThrottle 示例中查看使用加载器的示例代码。

Bluetooth A2DP 和耳机 API

Android 现在包含一些 API,供应用验证已连接的蓝牙 A2DP 和耳机配置文件设备的状态。例如,应用可以识别何时连接了蓝牙耳机来听音乐,并视情况通知用户。应用还可以接收供应商专用 AT 命令的广播,并通知用户已连接设备的状态(例如,所连接设备的电池电量不足时)。

您可以使用 A2DPHEADSET 配置文件常量和 BluetoothProfile.ServiceListener 调用 getProfileProxy(),以在蓝牙客户端连接或断开连接时接收回调,从而初始化相应的 BluetoothProfile

动画框架

借助全新的灵活动画框架,您可以为任何对象(View、Drawable、Fragment、Object 或任何其他对象)的任意属性添加动画效果。您可以使用它定义动画的多个方面,例如:

  • 时长
  • 重复次数和行为
  • 时间插值类型
  • Animator 可设置为同时播放动画、依序播放动画,或在指定的延迟后播放动画
  • 帧刷新延迟

默认情况下,您可以为对象的整数、浮点数和十六进制颜色值定义这些动画方面和其他方面。也就是说,如果某个对象具有其中一种类型的属性字段,您可以随时更改其值以影响动画。若要为任何其他类型的值添加动画效果,您可以通过实现 TypeEvaluator 接口来告知系统如何计算给定类型的值。

您可以使用以下两个 Animator 为属性的值添加动画效果:ValueAnimatorObjectAnimatorValueAnimator 会计算动画值,但不知道因此动画效果的具体对象或属性。它只执行计算,您必须监听更新并使用自己的逻辑处理数据。ObjectAnimatorValueAnimator 的子类,可让您设置要添加动画效果的对象和属性,并处理所有动画工作。也就是说,您需要为 ObjectAnimator 指定要添加动画效果的对象、随时间变化的对象属性,以及要随时间推移应用于该属性的一组值,然后启动动画。

此外,LayoutTransition 类还会为您对 activity 布局的更改启用自动过渡动画。若要为部分布局启用过渡效果,请创建一个 LayoutTransition 对象,并通过调用 setLayoutTransition() 在任意 ViewGroup 上设置它。这样,每当向组中添加项或从中移除项时,系统都会运行默认动画。如需指定自定义动画,请对 LayoutTransition 调用 setAnimator() 并提供自定义 Animator,例如上面讨论的 ValueAnimatorObjectAnimator

如需了解详情,请参阅属性动画文档。您还可以使用 API Demos 应用中的动画 API 查看多个示例。

扩展的界面框架

  • ListView 和 GridView 的多选选择

    setChoiceMode() 的新 CHOICE_MODE_MULTIPLE_MODAL 模式允许用户从 ListViewGridView 中选择多项。当与操作栏结合使用时,用户可以选择多项内容,然后从操作栏的选项列表(已转换为多选操作模式)中选择要执行的操作。

    如需启用单选题,请调用 setChoiceMode(CHOICE_MODE_MULTIPLE_MODAL) 并向 setMultiChoiceModeListener() 注册一个 MultiChoiceModeListener

    当用户长按某项内容时,操作栏会切换到多选操作模式。当系统通过调用 onItemCheckedStateChanged() 选择菜单项时,会通知 MultiChoiceModeListener

    如需查看多选选择的示例,请参阅 API 演示示例应用中的 List15.java 类。

  • 用于转换视图的新 API

    借助新的 API,您可以轻松对 activity 布局中的视图应用 2D 和 3D 转换。使用一组对象属性(用于定义视图的布局位置、方向、透明度等)可以实现新的转换。

    用于设置视图属性的新方法包括:setAlpha()setBottom()setLeft()setRight()setBottom()setPivotX()setPivotY()setRotationX()setRotationY()setScaleX()setScaleY()setAlpha() 等。

    某些方法还具有相应的 XML 属性,您可以在布局文件中指定该属性以应用默认转换。可用属性包括:translationXtranslationYrotationrotationXrotationYscaleXscaleYtransformPivotXtransformPivotYalpha

    通过将其中一些新的视图属性与新的动画框架(如上文所述)结合使用,您可以轻松地将一些精美的动画应用到您的视图。例如,如需在视图的 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();
    
  • 新的全息主题

    标准系统 widget 和整体外观已经过重新设计,并纳入了新的“全息”界面主题。系统使用标准的样式和主题系统来应用新的主题。

    默认情况下,任何以 Android 3.0 平台为目标平台的应用(通过将 android:minSdkVersionandroid:targetSdkVersion 值设置为 "11")都会继承全息主题。不过,如果您的应用也应用自己的主题,则主题将替换全息主题,除非您更新样式以继承全息主题。

    如需将全息主题应用于各个 activity,或在自己的主题定义中继承它们,请使用多个新的 Theme.Holo 主题之一。如果您的应用与低于 3.0 的 Android 版本兼容并应用自定义主题,则应根据平台版本选择主题

  • 新的 widget
    • AdapterViewAnimator

      AdapterView 的基类,可在其视图之间切换时执行动画。

    • AdapterViewFlipper

      简单的 ViewAnimator,在添加到它的两个或多个视图之间添加动画效果。一次只能显示一个孩子。如果收到请求,它可以定期在各个子节点之间自动切换。

    • CalendarView

      允许用户通过轻触日期从日历中选择日期,并且可以将日历滚动或滑动到所需的日期。您可以配置微件中提供的日期范围。

    • ListPopupWindow

      将自身锚定到宿主视图,并显示选项列表,例如在 EditText 视图中输入内容时提供建议列表。

    • NumberPicker

      允许用户从预定义的范围中选择一个数字。该 widget 显示一个输入字段以及用于选择数字的向上和向下按钮。触摸输入字段可让用户滚动浏览值,或再次触摸以直接修改当前值。它还允许您将位置映射到字符串,以便显示相应的字符串,而不是索引位置。

    • PopupMenu

      在锚定到视图的模态弹出式窗口中显示 Menu。如果有足够的空间,弹出式窗口会显示在锚点视图下方,如果没有空间,则会在锚点视图上方显示。如果 IME(软键盘)可见,弹出式内容不会与其重叠,直到用户轻触菜单为止。

    • SearchView

      提供一个搜索框,您可以将该搜索框配置为向指定的 activity 传递搜索查询并显示搜索建议(采用与传统搜索对话框相同的方式)。该 widget 特别适用于在操作栏中提供搜索 widget。如需了解详情,请参阅创建搜索界面

    • StackView

      一种视图,可在 3D 堆栈中显示其子项,并允许用户像 rolodex 一样滑动浏览视图。

图形

  • 硬件加速 2D 图形

    现在,您可以通过在清单元素的 <application> 元素中或为各个 <activity> 元素中设置 android:hardwareAccelerated="true",为您的应用启用 OpenGL 渲染程序。

    此标记有助于应用加快绘制速度。这样可以实现更流畅的动画、更顺畅的滚动,以及更好的整体性能和用户互动响应。

  • 查看对硬件层和软件层的支持

    默认情况下,View 未指定图层。您可以使用 setLayerType()layerType 属性指定视图由硬件层或软件层(由 LAYER_TYPE_HARDWARELAYER_TYPE_SOFTWARE 值指定)提供支持。

    硬件层由硬件专用纹理(通常是 OpenGL 硬件上的帧缓冲区对象或 FBO)提供支持,并且会导致使用 Android 的硬件渲染管道渲染视图,但前提是必须为视图层次结构启用硬件加速。停用硬件加速后,硬件层的行为将与软件层完全相同。

    软件层由位图提供支持,并且会导致使用 Android 的软件渲染管道渲染视图,即使启用了硬件加速也是如此。当受影响的视图树经常更新时,应避免使用软件层。每次更新都需要重新渲染软件层,速度可能很慢。

    如需了解详情,请参阅 LAYER_TYPE_HARDWARELAYER_TYPE_SOFTWARE 文档。

  • Renderscript 3D 图形引擎

    Renderscript 是一个运行时 3D 框架,提供用于构建 3D 场景的 API,以及一种独立于平台的特殊着色器语言,以实现最佳性能。借助 Renderscript,您可以加快图形操作和数据处理速度。Renderscript 是为应用、壁纸、轮播界面等制作高性能 3D 效果的理想方式。

    如需了解详情,请参阅使用 Renderscript 进行 3D 渲染和计算文档。

媒体

  • “延时摄影”视频

    Camcorder API 现在支持录制延时摄影视频。setCaptureRate() 设置应捕获帧的速率。

  • 图像流的纹理支持

    新的 SurfaceTexture 允许您将图像流作为 OpenGL ES 纹理捕获。通过为 Camera 实例调用 setPreviewTexture(),您可以指定 SurfaceTexture,以便在相机中绘制视频播放或预览帧。

  • HTTP 直播

    应用现在可以将 M3U 播放列表网址传递给媒体框架,以开始 HTTP 直播会话。媒体框架支持大多数 HTTP Live Streaming 规范,包括自适应比特率。如需了解详情,请参阅支持的媒体格式文档。

  • EXIF 数据

    ExifInterface 包含针对照片光圈、ISO 和曝光时间的新字段。

  • 摄像机个人资料

    借助新的 hasProfile() 方法和多个视频画质配置文件(如 QUALITY_1080PQUALITY_720PQUALITY_CIF 等),您可以确定便携式摄像机画质选项。

  • 数字媒体文件传输

    该平台内置了对通过 USB 的媒体/图片传输协议 (MTP/PTP) 的支持,可让用户轻松地在设备之间和主机之间传输任何类型的媒体文件。开发者可以在此支持的基础上开发出应用,让用户能够创建或管理可能需要跨设备传输或共享的富媒体文件。

  • 数字版权管理 (DRM)

    用于检查和行使数字版权的全新可扩展数字版权管理 (DRM) 框架。它是在两个架构层中实现的:

    • DRM Framework API:提供给应用,并通过适用于标准应用的 Dalvik VM 运行。
    • 原生代码 DRM 管理器:用于实现框架 API,并为 DRM 插件提供接口,以便处理各种 DRM 方案的版权管理和解密操作。

    对于应用开发者,该框架提供了一个抽象的统一 API,可简化受保护内容的管理。该 API 可以降低 DRM 操作的复杂性,并允许对受保护和不受保护的内容以及各种 DRM 方案使用一致的操作模式。

    对于设备制造商、内容所有者和互联网数字媒体提供商,DRM 框架的插件 API 提供了一种方法,支持在 Android 系统中添加对所选的 DRM 方案的支持,以便安全地强制执行内容保护。

    预览版不提供任何用于检查和行使数字权利的原生 DRM 插件。不过,设备制造商可能会在其设备上随附 DRM 插件。

    您可以在 android.drm 软件包中找到所有 DRM API。

键盘支持

  • 支持 Ctrl、Meta、Caps Lock、Num Lock 和 Scroll Lock 修饰符。如需了解详情,请参阅 META_CTRL_ON 和相关字段。
  • 支持完整的桌面式键盘,包括支持 Esc、Home、End、Delete 等键。您可以通过查询 getKeyboardType() 并检查 KeyCharacterMap.FULL 来确定按键事件是否来自全键盘
  • TextView 现在支持基于键盘的剪切、复制、粘贴和全选(使用组合键 Ctrl+X、Ctrl+C、Control+V 和 Control+A)。它还支持 PageUp/PageDown、Home/End 和基于键盘的文本选择。
  • KeyEvent 添加了几种新方法,可让您更轻松地正确且一致地检查按键修饰符状态。请参阅 hasModifiers(int)hasNoModifiers()metaStateHasModifiers()metaStateHasNoModifiers()
  • 应用可以通过对 ActivityDialogView 进行子类化并实现 onKeyShortcut() 来实现自定义键盘快捷键。每当某个按键与 Ctrl 键组合在一起时,框架都会调用此方法。创建选项菜单时,您可以通过为每个 <item> 元素(或使用 setShortcut())设置 android:alphabeticShortcutandroid:numericShortcut 属性来注册键盘快捷键。
  • Android 3.0 包含一种 ID 为 KeyCharacterMap.VIRTUAL_KEYBOARD 的新“虚拟键盘”设备。虚拟键盘具有桌面设备样式的美式按键映射,可用于合成用于测试输入的按键事件。

拆分触摸事件

以前,一次只能有一个视图接受触摸事件。Android 3.0 支持跨视图甚至窗口拆分触摸事件,因此不同视图可以接受同时发生的触摸事件。

如果应用以 Android 3.0 为目标平台,拆分触摸事件会默认启用。也就是说,当应用将 android:minSdkVersionandroid:targetSdkVersion 属性的值设置为 "11" 时。

不过,您可以利用以下属性在特定视图组内的视图和窗口之间停用分屏触摸事件。

  • 通过视图组的 android:splitMotionEvents 属性,您可以停用在布局中的子视图之间发生的分屏触摸事件。例如:
    <LinearLayout android:splitMotionEvents="false" ... >
        ...
    </LinearLayout>
    

    这样,线性布局中的子视图就无法拆分触摸事件,一次只能有一个视图接收触摸事件。

  • 借助 android:windowEnableSplitTouch 样式属性,您可以将分屏触摸事件应用于 activity 或整个应用的主题,从而停用跨窗口的分屏触摸事件。例如:
    <style name="NoSplitMotionEvents" parent="android:Theme.Holo">
        <item name="android:windowEnableSplitTouch">false</item>
        ...
    </style>
    

    当该主题应用于 <activity><application> 时,系统仅接受当前 activity 窗口中的触摸事件。例如,通过停用跨窗口拆分触摸事件,系统栏无法与 activity 同时接收触摸事件。这并不影响 activity 内的视图是否可以拆分触摸事件 - 默认情况下,activity 仍然可以在视图之间拆分触摸事件。

    如需详细了解如何创建主题,请参阅应用样式和主题

WebKit

  • 新增了 WebViewFragment 类,用于创建由 WebView 组成的 fragment。
  • 新增了 WebSettings 方法:
  • 新增了 WebView 方法:
    • onPause() 回调,以便在 WebView 变为隐藏状态时暂停与 WebView 相关联的任何处理。当 WebView 未在前台运行时,这有助于减少不必要的 CPU 或网络流量。
    • onResume() 回调,用于恢复与 WebView 相关联的处理,该处理在 onPause() 期间已暂停。
    • saveWebArchive() 可让您将当前视图另存为设备上的网页归档文件。
    • showFindDialog() 可在当前视图中启动文本搜索。

浏览器

浏览器应用添加了以下功能来支持 Web 应用:

  • 媒体捕获

    根据 HTML 媒体捕获规范的定义,浏览器允许 Web 应用访问设备的音频、图片和视频捕获功能。例如,以下 HTML 为用户提供了捕获要上传的照片的输入:

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

    或者,通过排除 capture=camera 参数,用户可以选择使用相机拍摄新图片,或从设备(例如从 Gallery 应用中)选择一张图片。

  • 设备方向

    根据设备屏幕方向事件规范的定义,浏览器允许 Web 应用监听提供设备物理方向和运动相关信息的 DOM 事件。

    设备方向用 x 轴、y 轴和 z 轴表示(以度为单位),而运动用加速度和旋转速率数据表示。网页可以通过调用事件类型为 "deviceorientation"window.addEventListener 来注册方向事件,也可以通过注册 "devicemotion" 事件类型来注册动作事件。

  • CSS 3D 转换

    根据 CSS 3D 转换模块规范的定义,浏览器允许在三维空间内转换由 CSS 渲染的元素。

JSON 实用程序

新类 JsonReaderJsonWriter 可帮助您读取和写入 JSON 流。这些新 API 是对 org.json 类(用于操作内存中的文档)的补充。

您可以通过调用其构造函数方法并传递提供 JSON 字符串的 InputStreamReader 来创建 JsonReader 实例。然后,通过调用 beginObject() 开始读取对象,使用 nextName() 读取键名,使用与类型相关的方法(例如 nextString()nextInt())读取值,并在 hasNext() 为 true 时继续读取。

您可以通过调用其构造函数并传递相应的 OutputStreamWriter 来创建 JsonWriter 的实例。然后,以与读取器类似的方式写入 JSON 数据,使用 name() 添加属性名称,并使用适当的 value() 方法添加相应的值。

默认情况下,这些类是严格的。每个类中的 setLenient() 方法都对 API 请求进行配置,使它们在接受的 API 方面更为宽松。这种宽松解析模式还与 org.json 的默认解析器兼容。

新功能常量

<uses-feature> Manfest 元素应用于向外部实体(例如 Google Play)表明应用所依赖的硬件和软件功能集。在此版本中,Android 添加了以下应用可使用此元素声明的新常量:

  • "android.hardware.faketouch"

    声明后,这表示应用与提供模拟触摸屏(或更好的触摸屏)的设备兼容。如果设备带有模拟触摸屏,则其会为用户提供可以模拟部分触摸屏功能的用户输入系统。例如,驱动屏幕光标的鼠标或遥控器就属于此类输入系统。此类输入系统支持点击、点击和拖动等基本触摸事件。不过,在模拟触摸设备上,更复杂的输入类型(如手势、快速滑动等)可能更加困难或不可能(并且多点触控手势绝对不可能实现)。

    如果您的应用不需要复杂的手势,并且您不希望自己的应用从具有模拟触摸屏的设备中滤除,则应使用 <uses-feature> 元素声明 "android.hardware.faketouch"。这样,您的应用就可以供尽可能多的设备类型使用,包括只提供模拟触摸屏输入的设备类型。

    所有包含触摸屏的设备也支持 "android.hardware.faketouch",因为触摸屏功能是模拟触摸功能的超集。因此,除非您确实需要触摸屏,否则应添加用于模拟触摸的 <uses-feature> 元素。

新权限

新平台技术

  • 存储
    • ext4 文件系统支持,用于启用板载 eMMC 存储设备。
    • 用于支持 MTP 设备的 FUSE 文件系统。
    • 支持 USB 主机模式,从而支持键盘和 USB 集线器。
    • 支持 MTP/PTP
  • Linux 内核
    • 已升级到 2.6.36
  • Dalvik 虚拟机
    • 用于支持和优化 SMP 的新代码
    • 对 JIT 基础架构进行了多项改进
    • 垃圾回收器改进:
      • 针对 SMP 调谐
      • 支持更大的堆大小
      • 统一处理位图和字节缓冲区
  • Dalvik 核心库
    • 更快速地实现 NIO(现代 I/O 库)的新实现
    • 改进了异常消息
    • 全过程正确性和性能修复

API 差异报告

如需详细了解 Android 3.0(API 级别 11)中的所有 API 变更,请参阅 API 差异报告

API 级别

Android 3.0 平台提供了更新版本的框架 API。Android 3.0 API 被分配一个整数标识符 11,该标识符存储在系统本身中。此标识符称为“API 级别”,可让系统在安装应用之前正确确定应用是否与系统兼容。

若要在您的应用中使用 Android 3.0 中引入的 API,您需要根据 Android 3.0 SDK 平台中提供的 Android 库编译应用。根据您的需求,您可能还需要在应用清单中向 <uses-sdk> 元素添加一个 android:minSdkVersion="11" 属性。如果您的应用设计为仅在 Android 2.3 及更高版本上运行,则声明该属性会阻止应用安装在较低版本的平台上。

如需了解详情,请参阅什么是 API 级别?