Module droid_wrap::android::content
source · Expand description
包含用于访问和发布设备上的数据的类。
Structs§
- 与应用程序环境相关的全局信息的接口。这是一个抽象类,其实现由 Android 系统提供。它允许访问特定于应用程序的资源和类,以及对应用程序级操作(如启动活动、广播和接收意图等)的向上调用。
- Context 的代理实现,它只是将其所有调用委托给另一个 Context。可以创建子类来修改行为,而无需更改原始 Context。
- 意图是要执行的操作的抽象描述。它可以与 startActivity 一起使用来启动活动,与 broadcastIntent 一起使用来将其发送到任何感兴趣的 BroadcastReceiver 组件,以及与 Context.startService 或 Context.bindService 一起使用来与后台 android.app.Service 通信。意图提供了一种在不同应用程序的代码之间执行后期运行时绑定的功能。它最重要的用途是在启动活动时,可以将其视为活动之间的粘合剂。它基本上是一个被动数据结构,包含要执行的操作的抽象描述。开发人员指南有关如何创建和解析意图的信息,请阅读意图和意图过滤器开发人员指南。意图结构意图中的主要信息包括:动作——要执行的一般操作,例如 ACTION_VIEW、ACTION_EDIT、ACTION_MAIN 等。数据——要操作的数据,例如联系人数据库中的人员记录,以 Uri 表示。动作/数据对的一些示例如下:ACTION_VIEW content://contacts/people/1 – 显示标识符为“1”的人员的信息。ACTION_DIAL content://contacts/people/1 – 显示填写了联系人的电话拨号器。ACTION_VIEW tel:123 – 显示填有给定号码的电话拨号器。请注意 VIEW 操作如何对特定 URI 执行被认为是最合理的事情。ACTION_DIAL tel:123 – 显示填有给定号码的电话拨号器。ACTION_EDIT content://contacts/people/1 – 编辑标识符为“1”的人员的信息。ACTION_VIEW content://contacts/people/ – 显示联系人列表,用户可以浏览。此示例是联系人应用的典型顶级条目,向您显示联系人列表。选择要查看的特定人员将导致使用新意图 { ACTION_VIEW content://contacts/people/N } 来启动活动以显示该人员。除了这些主要属性之外,您还可以在 Intent 中包含许多次要属性:category - 提供有关要执行的操作的其他信息。例如,CATEGORY_LAUNCHER 表示它应作为顶级应用程序出现在 Launcher 中,而 CATEGORY_ALTERNATIVE 表示它应包含在用户可以对数据执行的备选操作列表中。type - 指定 Intent 数据的显式类型(MIME 类型)。通常,类型是从数据本身推断出来的。通过设置此属性,您可以禁用该评估并强制使用显式类型。component - 指定用于 Intent 的组件类的显式名称。通常,这是通过查看 Intent 中的其他信息(操作、数据/类型和类别)并将其与可以处理它的组件匹配来确定的。如果设置了此属性,则不会执行任何评估,并且此组件将按原样使用。通过指定此属性,所有其他 Intent 属性都变为可选。extras——这是任何附加信息的 Bundle。这可用于向组件提供扩展信息。例如,如果我们有一个发送电子邮件消息的操作,我们还可以在此处包含额外的数据以提供主题、正文等。以下是您可以使用这些附加参数指定为意图的其他操作的一些示例:ACTION_MAIN with category CATEGORY_HOME – 启动主屏幕。ACTION_GET_CONTENT with MIME type vnd.android.cursor.item/phone – 显示人们的电话号码列表,允许用户浏览并选择一个并将其返回到父活动。ACTION_GET_CONTENT with MIME type */* and category CATEGORY_OPENABLE – 显示所有可以使用ContentResolver打开的数据的选择器。 OpenInputStream(),允许用户选择其中一个,然后在其中选择一些数据,然后将结果URI返回到呼叫者。例如,可以在电子邮件应用程序中使用,以允许用户选择一些数据以作为附件。Intent 类中定义了各种标准 Intent 操作和类别常量,但应用程序也可以定义自己的常量。这些字符串使用 Java 样式的作用域,以确保它们是唯一的 - 例如,标准 ACTION_VIEW 称为“android.intent.action.VIEW”。组合起来,操作、数据类型、类别和额外数据集合为系统定义了一种语言,允许表达诸如“呼叫约翰史密斯的牢房”之类的短语。随着应用程序添加到系统中,它们可以通过添加新的操作、类型和类别来扩展此语言,或者它们可以通过提供自己的活动来处理现有短语的行为来修改现有短语的行为。意图解析您将使用两种主要形式的意图。显式意图已指定组件(通过 setComponent 或 setClass),该组件提供要运行的确切类。通常,这些不会包含任何其他信息,只是应用程序在用户与应用程序交互时启动其拥有的各种内部活动的一种方式。隐式意图未指定组件;相反,它们必须包含足够的信息,以便系统确定哪个可用组件最适合运行该意图。当使用隐式意图时,给定这样一个任意意图,我们需要知道如何处理它。这是由意图解析过程处理的,它将意图映射到可以处理它的活动、广播接收器或 android.app.service(有时是两个或更多活动/接收器)。意图解析机制基本上围绕将意图与已安装的应用程序包中的所有 描述进行匹配。 (此外,对于广播,任何 BroadcastReceiver 对象都明确注册到 Context.registerReceiver。)有关此内容的更多详细信息,请参阅 IntentFilter 类的文档。Intent 中有三部分信息用于解析:操作、类型和类别。使用这些信息,在 PackageManager 上查询可以处理该意图的组件。根据 AndroidManifest.xml 文件中提供的意图信息确定适当的组件,如下所示:如果给出了操作,则组件必须将其列为其处理的操作。如果 Intent 中尚未提供类型,则从 Intent 的数据中查询类型。与操作一样,如果意图中包含某种类型(在其数据中明确或隐式地包含),则组件必须将其列为其处理的类型。对于不是 content: URI 的数据,并且 Intent 中未包含明确类型,则将考虑意图数据的方案(例如 http: 或 mailto:)。同样,与操作一样,如果我们要匹配一个方案,则组件必须将其列为可以处理的方案。如果提供了类别,则活动必须将其全部列为其处理的类别。也就是说,如果您包括类别 CATEGORY_LAUNCHER 和 CATEGORY_ALTERNATIVE,那么您将只解析具有列出这两个类别的意图的组件。活动通常需要支持 CATEGORY_DEFAULT,以便 Context.startActivity() 可以找到它们。例如,考虑 Note Pad 示例应用程序,它允许用户浏览笔记数据列表并查看有关各个项目的详细信息。斜体文本表示您将用特定于您自己的包的名称替换名称的位置。<manifest xmlns:android=“http://schemas.android.com/apk/res/android”package=“com.android.notepad”><application android:icon=“@drawable/app_notes”android:label=“@string/app_name”><provider class=“.NotePadProvider”android:authorities=“com.google.provider.NotePad” /><activity class=“.NotesList” android:label=“@string/title_notes_list”><intent-filter><action android:name=“android.intent.action.MAIN” /><category android:name=“android.intent.category.LAUNCHER” /></intent-filter><intent-filter><action android:name=“android.intent.action.VIEW” /><action android:name=“android.intent.action.EDIT” /><action android:name=“android.intent.action.PICK” /><category android:name=“android.intent.category.DEFAULT” /><data android:mimeType=“vnd.android.cursor.dir/vnd.google.note” /></intent-filter><intent-filter><action android:name=“android.intent.action.GET_CONTENT” /><category android:name=“android.intent.category.DEFAULT” /><data android:mimeType=“vnd.android.cursor.item/vnd.google.note” /></intent-filter></activity><activity class=“.NoteEditor” android:label=“@string/title_note”><intent-filter android:label=“@string/resolve_edit”><action android:name=“android.intent.action.VIEW” /><action android:name=“android.intent.action.EDIT” /><category android:name=“android.intent.category.DEFAULT” /><data android:mimeType=“vnd.android.cursor.item/vnd.google.note” /></intent-filter><intent-filter><action android:name=“android.intent.action.INSERT” /><category android:name=“android.intent.category.DEFAULT” /><data android:mimeType=“vnd.android.cursor.dir/vnd.google.note” /></intent-filter></activity><activity class=“.TitleEditor” android:label=“@string/title_edit_title”android:theme=“@android:style/Theme.Dialog”><intent-filter android:label=“@string/resolve_title”><action android:name=“com.android.notepad.action.EDIT_TITLE” /><category android:name=“android.intent.category.DEFAULT” /><category android:name=“android.intent.category.ALTERNATIVE” /><category android:name=“android.intent.category.SELECTED_ALTERNATIVE” /><data android:mimeType=“vnd.android.cursor.item/vnd.google.note” /></intent-filter></activity></application></manifest>第一个活动 com.android.notepad.NotesList 是我们进入应用程序的主要入口。它可以做三件事,正如它的三个意图模板所描述的那样:<intent-filter><action android:name=“android.intent.action.MAIN” /><category android:name=“android.intent.category.LAUNCHER” /></intent-filter>这为 NotePad 应用程序提供了顶级入口:标准 MAIN 操作是一个主入口点(不需要 Intent 中的任何其他信息),LAUNCHER 类别表示此入口点应在应用程序启动器中列出。<intent-filter><action android:name=“android.intent.action.VIEW” /><action android:name=“android.intent.action.EDIT” /><action android:name=“android.intent.action.PICK” /><category android:name=“android.intent.category.DEFAULT” /><data android:mimeType=“vnd.android.cursor.dir/vnd.google.note” /></intent-filter>这声明了活动可以对便笺目录执行的操作。所支持的类型由 标记指定,其中 vnd.android.cursor.dir/vnd.google.note 是一个 URI,可从中查询包含我们的记事本数据 (vnd.google.note) 的零个或多个项目的 Cursor (vnd.android.cursor.dir)。该活动允许用户查看或编辑数据目录 (通过 VIEW 和 EDIT 操作),或选择特定便笺并将其返回给调用者 (通过 PICK 操作)。还请注意此处提供的 DEFAULT 类别:当未明确指定组件名称时,Context.startActivity 方法需要此类别来解析您的活动。<intent-filter><action android:name=“android.intent.action.GET_CONTENT” /><category android:name=“android.intent.category.DEFAULT” /><data android:mimeType=“vnd.android.cursor.item/vnd.google.note” /></intent-filter>此过滤器描述了向调用者返回用户选择的注释而无需知道注释来自何处的能力。数据类型 vnd.android.cursor.item/vnd.google.note 是一个 URI,可以从中查询一个包含我们的记事本数据 (vnd.google.note) 的项 (vnd.android.cursor.item)。GET_CONTENT 操作类似于 PICK 操作,其中活动将向其调用者返回用户选择的一段数据。但是,在这里,调用者指定他们想要的数据类型,而不是用户将从中选择的数据类型。鉴于这些功能,以下意图将解析为 NotesList 活动:{ action=android.app.action.MAIN } 匹配所有可用作应用程序顶级入口点的活动。{ action=android.app.action.MAIN, category=android.app.category.LAUNCHER } 是启动器用来填充其顶级列表的实际意图。{ action=android.intent.action.VIEW data=content://com.google.provider.NotePad/notes } 显示“content://com.google.provider.NotePad/notes”下的所有笔记的列表,用户可以浏览并查看其详细信息。{ action=android.app.action.PICK data=content://com.google.provider.NotePad/notes } 提供“content://com.google.provider.NotePad/notes”下的注释列表,用户可以从中挑选一个注释,并将其数据URL返回给调用者。{ action=android.app.action.GET_CONTENT type=vnd.android.cursor.item/vnd.google.note } 与 pick 动作类似,但允许调用者指定他们想要返回的数据类型,以便系统可以找到适当的活动来选择该数据类型的内容。第二个活动 com.android.notepad.NoteEditor 向用户显示单个笔记条目并允许他们编辑它。它可以做两件事,如其两个意图模板所述:<intent-filter android:label=“@string/resolve_edit”><action android:name=“android.intent.action.VIEW” /><action android:name=“android.intent.action.EDIT” /><category android:name=“android.intent.category.DEFAULT” /><data android:mimeType=“vnd.android.cursor.item/vnd.google.note” /></intent-filter>此活动的第一个主要目的是让用户与单个注释进行交互,如 MIME 类型 vnd.android.cursor.item/vnd.google.note 所述。此活动可以查看注释或允许用户编辑注释。我们再次支持 DEFAULT 类别,以允许在不明确指定其组件的情况下启动活动。<intent-filter><action android:name=“android.intent.action.INSERT” /><category android:name=“android.intent.category.DEFAULT” /><data android:mimeType=“vnd.android.cursor.dir/vnd.google.note” /></intent-filter>此活动的第二个用途是将新笔记条目插入现有笔记目录中。这在用户创建新笔记时使用:在笔记目录上执行 INSERT 操作,导致此活动运行并让用户创建新笔记数据,然后将其添加到内容提供程序。鉴于这些功能,以下意图将解析为 NoteEditor 活动:{ action=android.intent.action.VIEW data=content://com.google.provider.NotePad/notes/{ID} } 向用户显示注释{ID}的内容。{ action=android.app.action.EDIT data=content://com.google.provider.NotePad/notes/{ID} } 允许用户编辑注释{ID}的内容。{ action=android.app.action.INSERT data=content://com.google.provider.NotePad/notes } 在“content://com.google.provider.NotePad/notes”的注释列表中创建一个新的空注释,并允许用户编辑它。如果他们保留更改,则将新创建的注释的 URI 返回给调用者。最后一个活动 com.android.notepad.TitleEditor 允许用户编辑笔记的标题。这可以作为应用程序直接调用的类来实现(通过在 Intent 中明确设置其组件),但这里我们展示了一种可以在现有数据上发布替代操作的方法:<intent-filter android:label=“@string/resolve_title”><action android:name=“com.android.notepad.action.EDIT_TITLE” /><category android:name=“android.intent.category.DEFAULT” /><category android:name=“android.intent.category.ALTERNATIVE” /><category android:name=“android.intent.category.SELECTED_ALTERNATIVE” /><data android:mimeType=“vnd.android.cursor.item/vnd.google.note” /></intent-filter>在这里的单个意图模板中,我们创建了自己的私有操作,称为 com.android.notepad.action.EDIT_TITLE,表示编辑笔记的标题。它必须在特定笔记(数据类型 vnd.android.cursor.item/vnd.google.note)上调用,就像以前的查看和编辑操作一样,但这里显示和编辑笔记数据中包含的标题。除了像往常一样支持默认类别外,我们的标题编辑器还支持另外两个标准类别:ALTERNATIVE 和 SELECTED_ALTERNATIVE。实现这些类别允许其他人通过 PackageManager.queryIntentActivityOptions 方法找到它提供的特殊操作而无需直接了解它,或者更常见的是使用 android.view.Menu.addIntentOptions 构建动态菜单项。请注意,在这里的意图模板中,还为模板提供了一个明确的名称(通过 android:label=“@string/resolve_title”),以便更好地控制用户在将此活动作为他们正在查看的数据的替代操作呈现时看到的内容。鉴于这些功能,以下意图将解析为 TitleEditor 活动:{ action=com.android.notepad.action.EDIT_TITLE data=content://com.google.provider.NotePad/notes/{ID} } 显示并允许用户编辑与注释 {ID} 相关的标题。标准活动操作这些是 Intent 为启动活动定义的当前标准操作(通常通过 Context.startActivity)。其中最重要的,也是迄今为止最常用的是 ACTION_MAIN 和 ACTION_EDIT。ACTION_MAIN, ACTION_VIEW, ACTION_ATTACH_DATA, ACTION_EDIT, ACTION_PICK, ACTION_CHOOSER, ACTION_GET_CONTENT, ACTION_DIAL,ACTION_CALL, ACTION_SEND, ACTION_SENDTO, ACTION_ANSWER, ACTION_INSERT, ACTION_DELETE, ACTION_RUN, ACTION_SYNC,ACTION_PICK_ACTIVITY, ACTION_SEARCH, ACTION_WEB_SEARCH, ACTION_FACTORY_TEST标准广播操作这些是 Intent 为接收广播定义的当前标准操作(通常通过 Context.registerReceiver 或清单中的 标签)。ACTION_TIME_TICK, ACTION_TIME_CHANGED, ACTION_TIMEZONE_CHANGED, ACTION_BOOT_COMPLETED, ACTION_PACKAGE_ADDED, ACTION_PACKAGE_CHANGED, ACTION_PACKAGE_REMOVED, ACTION_PACKAGE_RESTARTED,ACTION_PACKAGE_DATA_CLEARED, ACTION_PACKAGES_SUSPENDED, ACTION_PACKAGES_UNSUSPENDED, ACTION_UID_REMOVED, ACTION_BATTERY_CHANGED, ACTION_POWER_CONNECTED, ACTION_POWER_DISCONNECTED, ACTION_SHUTDOWN,注意:如果您的应用以 Android 11(API 级别 30)或更高版本为目标平台,则注册包含 extras 中的软件包详细信息的广播(例如 ACTION_PACKAGES_SUSPENDED)将收到经过筛选的应用列表或什么也不会收到。详细了解如何管理软件包可见性。标准类别这些是当前的标准类别,可用于通过AddCategory进一步阐明意图。CATEGORY_DEFAULT, CATEGORY_BROWSABLE, CATEGORY_TAB, CATEGORY_ALTERNATIVE, CATEGORY_SELECTED_ALTERNATIVE, CATEGORY_LAUNCHER, CATEGORY_INFO, CATEGORY_HOME,CATEGORY_PREFERENCE, CATEGORY_TEST, CATEGORY_CAR_DOCK, CATEGORY_DESK_DOCK, CATEGORY_LE_DESK_DOCK, CATEGORY_HE_DESK_DOCK, CATEGORY_CAR_MODE, CATEGORY_APP_MARKET,CATEGORY_VR_HOME标准额外数据这些是当前标准字段,可通过 putExtra 用作额外数据。EXTRA_ALARM_COUNT, EXTRA_BCC, EXTRA_CC, EXTRA_CHANGED_COMPONENT_NAME, EXTRA_DATA_REMOVED, EXTRA_DOCK_STATE, EXTRA_DOCK_STATE_HE_DESK, EXTRA_DOCK_STATE_LE_DESK,EXTRA_DOCK_STATE_CAR, EXTRA_DOCK_STATE_DESK, EXTRA_DOCK_STATE_UNDOCKED, EXTRA_DONT_KILL_APP, EXTRA_EMAIL, EXTRA_INITIAL_INTENTS, EXTRA_INTENT, EXTRA_KEY_EVENT,EXTRA_ORIGINATING_URI, EXTRA_PHONE_NUMBER, EXTRA_REFERRER, EXTRA_REMOTE_INTENT_TOKEN, EXTRA_REPLACING, EXTRA_SHORTCUT_ICON, EXTRA_SHORTCUT_ICON_RESOURCE, EXTRA_SHORTCUT_INTENT,EXTRA_STREAM, EXTRA_SHORTCUT_NAME, EXTRA_SUBJECT, EXTRA_TEMPLATE, EXTRA_TEXT, EXTRA_TITLE, EXTRA_UID, EXTRA_USER_INITIATED,标志这些是可以通过 setFlags 和 addFlags 在 Intent 中使用的可能标志。请参阅 setFlags 以获取所有可能标志的列表。
Functions§
- 测试android.content