意图Intent
前言
对意图Intent,学习安卓需掌握。以官方链接:http://www.android-doc.com/reference/android/content/Intent.html
所有文字全靠打。
意图描述
:意图是要执行的操作的抽象描述。它可以用来startActivity启动一个Activity,broadcastIntent发送给任何感兴趣的BroadcastReceiver组件,startService(Intent)或者bindService(Intent, ServiceConnection, int)与背景进行同行Service。
Intent为在不同应用程序中代码之间执行延迟的运行时绑定提供了一种工具。其最重要的用途是开展活动,在活动中它可以被认为是活动之间的胶水。它基本上是一个被动的数据结构,对要执行的动作进行抽象描述。
意图结构
意图的主要信息是:
动作要被执行的一般操作,如-,ACTION_VIEW等。ACTION_EDITACTION_MAIN
数据-要操作的数据,例如联系人数据库中的人员记录,表示为Uri。
动作、数据对的一些例子是:
- ACTION_VIEW content://contacts/people/1-显示标识符为“1”的人的信息。
- ACTION_DIAL 内容://联系人/人员/1-显示与填写人员的电话拨号程序。
- ACTION_VIEW电话:123-显示电话号码填写给定的号码。请注意,VIEW操作如何做什么被认为是一个特定的URI最合理的事情。
- ACTION_DIAL电话:123-显示填写给定号码的电话拨号程序。
ACTION_EDI内容://contacts/people/-显示用户可以浏览的人来查看会导致一个新的意图(ACTION_VIEW content://contacts/N )被用来启动一个活动来显示这个人。
处理这些主要属性之外,还有一些辅助属性,您还可以将其包含在意图中:
类别-提供有关要执行的操作的附加信息。例如,CATEGORY_LAUNCHER表示它应该作为顶层应用程序出现在启动器中,而CATEGORY_ALTERNATIVE意味着它应该包含在用户可以在一段数据上执行的备用动作列表中。
- 类型-指定意图数据的显示类型(MIME类型)。通常这个类型是从数据本身推断出来的。通过设置此属性,可以禁用该评估并强制显式类型。
- 组件-指定用于意图的组件类的显式名称。通常这是通过查看意图中的其他信息(操作,数据/类型和类别)并将其与可以处理它的组件匹配来确定的。如果设置了该属性,则不执行评估,并且完全按照原样使用该组件。通过指定这个属性,所有其他的意图属性变成可选的。
额外-这是Bundle任何额外的信息。这可以用来向组件提供扩展信息。例如,如果我们一个发送电子邮件的动作,我们也可以在这里包含额外的数据以提供主题,主体等。
以下是可以使用这些附加参数指定为意向的其他操作的一些示例:
ACTION_MAIN与类别CATEGORY_HOME-启动主屏幕。
- ACTION_GET_CONTENT与MIME类型vnd.android.cursor.item/phone-显示人的电话号码列表,允许用户浏览他们,并选择一个,并将其返回到父活动。
ACTION_GET_CONTENT与MIME类型/ 和类别CATEGORY_OPENABLE -显示可以打开的数据的所有选择器ContentResolver. openInputStream(),允许用户选择其中的一个,然后在其中的一些数据,并返回结果的URI给调用者。例如,这可以在电子邮件应用程序中使用,以允许用户选择一些数据作为附件。
在Intent类中定义了各种标准的Intent动作和类别常理,但是应用程序也可以定义它们自的。这些字符串使用java风格范围,以确保它们是唯一的。-例如,标准ACTION_VIEW被称为“android.intent.action.VIEW”。
放在一起,这组动作,数据类型,类别和额外数据为系统定义了一个允许表达短语的语言,例如“call john smith’s cell”。随着应用程序被添加到系统中,他们可以通过添加新的动作,类型和类别来扩展这种语言,或者通过提供它们自己的活动来修改现有短语的行为。
意图解析
你将使用两种主要的意图形式。
- Explicit Intents 已经指定了一个组件(通过setComponent(ConmponentName)或setClass(Context, Class)),它提供了要运行的确切的类。通常这些信息不会包含任何其他信息,只是作为用户与应用程序交互时应用程序启动内部活动的一种方式。
隐含意图没有指定一个组件;相反,它们必须包含足够的系统信息,以确定哪个可用组件最适合执行该意图。
当使用隐式意图时,给定这样一个任意的意图,我们需要知道如何处理它。这是通过的过程中处理的意图的分辨率,其中意图映射到Activity,BroadcastReceiver 或者 Service(或有时两个或两个以上的活动/接收器),其可以处理它。
意图解析机制基本上是围绕安装的应用程序包中的所有 描述匹配一个Intent。(另外,在广播的情况下,任何BroadcastReceiver明确注册的对象registerReceiver(BroadcastReceiver, IntentFilter)。)关于这个的更多细节可以在IntentFilter类的文档中找到。
Intent中有三个用于解析的信息:操作,类型和类别。使用这些信息,查询PackageManager可以处理一个可以意图的组件。基于AndroidManifest.xml 文件中提供的意图信息确定适当的组件如下:
- 该动作,如果有,必须由作为一个它处理组件上市。
- 如果尚未在意图中提供该类型,则从Intent的数据中检索该类型。与动作一样,如果某个类型包含在意图中(在某数据中显式或隐式地包含),则该组将必须按组件列出。
- 对于不是content: URI的数据, Intent中不包含显式类型,而是考虑意图数据(如or)的方案。再次像动作一样,如果我们匹配一个方案,它必须被组件列为一个可以处理的组件。http:mailto:
- 如果提供的类别必须全部由活动列为它所处理的类别。也就是说,如果包括的类别CATEGORY_LAUNCHER和CATEGORY_ALTERNATIVE, 那么你只会解决到组件与列出的意图都这些类别。活动往往需要支持,CATEGORY_DEFAULT以便他们能够被发现Context.startActivity()。
例如,考虑“便笺簿”示例应用程序,该应用程序允许用户浏览便笺数据列表并查看有关各个项目的详细信息。用斜体字表示的地方是你将用一个特定于你自己的软件包的名字替换一个名字。
<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 = “ ” /> <category android:name = “ ” /> </ intent-filter>
android.intent.action.MAIN
android.intent.category.LAUNCHER
这提供了进入NotePad应用程序的顶层条目:标准的MAIN动作是一个主要的入口点(在Intent中不需要任何其他信息),并且LAUNCHET类别表示这个入口点应该被列在应用程序启动器中。
<intent-filter> <action android:name = “ ” /> <action android:name = “ ” /> <action android:name = “ ” /> <category android:name = “ ” /> <data mimeType:name = “vnd.android.cursor.dir / vnd.google.note ” /> </ intent-filter>
android.intent.action.VIEW
android.intent.action.EDIT
android.intent.action.PICK
android.intent.category.DEFAULT
这声明了活动可以在笔记目录上做的事情。被支持的类型是用标签给出的,其中 vnd.android.cursor.dir/vnd.google.note是一个URI,从中vnd.android.cursor.dir可以找到零或多个items()的Cursor,它保存我们的记事本data(vnd.google.note)。该活动允许用户查看或编辑数据目录(通过VIEW和EDIT操作),或选择一个特定的注释并将其返回给调用者(通过PICK操作)。还要注意这里提供的DEFAULT类别:当它的组件名称未被明确指定时,这是解决你的活动的方法所必需的 Context.startActivity。
<intent-filter> <action android:name = “ ” /> <category android:name = “ ” /> <data android:mimeType = “vnd.android.cursor.item / vnd.google.note ” /> </意图过滤器>
android.intent.action.GET_CONTENT
android.intent.category.DEFAULT
该过滤器描述了向用户返回由用户选择的笔记的能力,而不需要知道其来自何处。数据类型 vnd.android.cursor.item/vnd.google.note是一个URI,从中vnd.android.cursor.item可以检索到包含我们的记事本data(vnd.google.note)的一个()项目的光标。GET_CONTENT操作与PICK操作相似,在此操作会向用户返回由用户选择的一段数据。然而,在这里,调用者指定了他们想要的数据的类型,而不是用户将从中选择的数据的类型。
鉴于这些功能,以下意图将解析为NotesList活动:
{action = android.app.action.MAIN}匹配所有可用作应用程序顶级入口点的活动。
{action = android.app.action.MAIN,category = android.app.category.LAUNCHER}是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 = “ ” /> <action android:name = “ ” /> <category android:name = “ ” /> <data android:mimeType = “vnd.android.cursor.item / vnd.google.note ” /> </ intent-filter>
android.intent.action.VIEW
android.intent.action.EDIT
android.intent.category.DEFAULT
此活动的第一个主要目的是让用户与单个音符交互,如MIME类型所述 vnd.android.cursor.item/vnd.google.note。该活动可以查看注释或允许用户编辑它。我们再次支持DEFAULT类别,允许在没有明确指定其组件的情况下启动活动。
<intent-filter> <action android:name = “ ” /> <category android:name = “ ” /> <data android:mimeType = “vnd.android.cursor.dir / vnd.google.note ” /> </意图过滤器>
android.intent.action.INSERT
android.intent.category.DEFAULT
此活动的次要用途是将新的笔记条目插入到现有的笔记目录中。这在用户创建新注释时使用: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/”的注释列表中创建一个新的空白注释笔记“,并允许用户编辑它。如果他们保留其更改,新创建的笔记的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 = “ ” /> <category android:name = “ ” /> <类别机器人:名称= “ ” /> <数据机器人:mime类型= “vnd.android.cursor.item / vnd.google.note ” /> </意图滤波器>
android.intent.category.DEFAULT
android.intent.category.ALTERNATIVE
android.intent.category.SELECTED_ALTERNATIVE
在这里的单一意图模板中,我们创建了我们自己的私人行动 com.android.notepad.action.EDIT_TITLE,这意味着编辑笔记的标题。它必须在特定的注释(数据类型vnd.android.cursor.item/vnd.google.note)上被调用,如前面的视图和编辑操作,但是这里显示和编辑注释数据中包含的标题。
除了像往常一样支持默认类别外,我们的标题编辑器还支持另外两个标准类别:
ALTERNATIVE和SELECTED_ALTERNATIVE。实现这些类别允许其他人通过该queryIntentActivityOptions(ComponentName, Intent[], Intent, int)方法找到它提供的特殊动作,而不需要直接了解它 ,或者更经常地使用它来构建动态菜单项 addIntentOptions(int, int, int, ComponentName, Intent[], Intent, int, MenuItem[])。请注意,在意向模板中,还为模板(通过android:label=”@string/resolve_title”)提供了一个明确的名称,以更好地控制用户看到这个活动时看到的内容,作为他们正在查看的数据的替代动作。
鉴于这些功能,以下意图将解析为TitleEditor活动:
{action = com.android.notepad.action.EDIT_TITLE data = content://com.google.provider.NotePad/notes/ {ID} } 显示并允许用户编辑与笔记{ID}关联的标题。
标准活动行动
这些是意图为启动活动定义的当前标准动作(通常是通过startActivity(Intent)。)。最重要,也是最常用的,是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
概要
常量
串 ACTION_AIRPLANE_MODE_CHANGED
广播动作:用户已经将电话切换到或离开飞行模式。
串 ACTION_ALL_APPS 活动操作:列出所有可用的应用程序
输入:没有。
串 ACTION_ANSWER 活动行动:处理来电。
串 ACTION_APP_ERROR 活动行动:用户按下崩溃/ ANR对话框中的“报告”按钮。
串 ACTION_ASSIST 活动行动:执行辅助行动。
串 ACTION_ATTACH_DATA 用于表示某些数据应该附加到其他地方。
串 ACTION_BATTERY_CHANGED 广播动作:这是一个包含充电状态,电平和其他电池信息的粘性广播。
串 ACTION_BATTERY_LOW 广播动作:表示设备电池电量不足。
串 ACTION_BOOT_COMPLETED 广播动作:在系统完成启动后,广播一次。
串 ACTION_CALL 活动操作:对由数据指定的某人进行呼叫。
串 ACTION_CAMERA_BUTTON 广播动作:按下“相机按钮”。
串 ACTION_CHOOSER 活动行动:显示活动选择器,允许用户在继续之前选择他们想要的。
串 ACTION_CLOSE_SYSTEM_DIALOGS 广播动作:当用户动作应该请求临时系统对话框消除时广播。
串 ACTION_CONFIGURATION_CHANGED 广播动作:当前设备Configuration (方向,区域设置等)已经改变。
串 ACTION_CREATE_DOCUMENT 活动操作:允许用户创建新文档。
串 ACTION_CREATE_SHORTCUT 活动操作:创建一个快捷方式。
串 ACTION_DATE_CHANGED 广播动作:日期已更改。
串 ACTION_DEFAULT ACTION_VIEW在一段数据上执行的“标准”操作的同义词。
串 ACTION_DELETE 活动操作:从其容器中删除给定的数据。
串 ACTION_DEVICE_STORAGE_LOW 广播动作:表示设备上的内存不足的粘性广播
这是一个受保护的意图,只能由系统发送。
串 ACTION_DEVICE_STORAGE_OK 广播动作:表示设备上的内存不足情况不再存在
这是一个受保护的意图,只能由系统发送。
串 ACTION_DIAL 活动操作:拨打由数据指定的号码。
串 ACTION_DOCK_EVENT 广播动作:对设备的物理对接状态的变化进行粘贴广播。
串 ACTION_DREAMING_STARTED 广播动作:在系统开始做梦之后发送。
串 ACTION_DREAMING_STOPPED 广播动作:在系统停止梦中之后发送。
串 ACTION_EDIT 活动操作:提供对给定数据的显式可编辑访问。
串 ACTION_GTALK_SERVICE_CONNECTED 广播动作:GTalk连接已经建立。
串 ACTION_MANAGE_PACKAGE_STORAGE 广播操作:表示用户确认的内存不足情况通知,包管理应启动。
串 ACTION_MEDIA_BUTTON 广播动作:按下“媒体按钮”。
串 ACTION_MEDIA_REMOVED 广播动作:外部媒体已被删除。
串 ACTION_MEDIA_SCANNER_SCAN_FILE 广播动作:要求媒体扫描器扫描文件并将其添加到媒体数据库。
串 ACTION_MY_PACKAGE_REPLACED 广播动作:您的应用程序的新版本已经安装在现有的版本上。
串 ACTION_PACKAGE_DATA_CLEARED 广播动作:用户清除了一个包的数据。
串 ACTION_PACKAGE_INSTALL 这个常量在API级别14中被弃用。这个常量从来没有被使用过。
串 ACTION_PACKAGE_REPLACED 广播操作:安装了新版本的应用程序包,替换以前安装的现有版本。
串 ACTION_PASTE 活动操作:在给定的容器中创建一个新的项目,从剪贴板的当前内容初始化它。
串 ACTION_QUICK_CLOCK 当用户点击系统“快速设置”区域中的时钟小部件时发送。
串 ACTION_SEARCH 活动操作:执行搜索。
串 ACTION_SHUTDOWN 广播动作:设备正在关闭。
串 ACTION_SYNC 活动操作:执行数据同步。
串 ACTION_SYSTEM_TUTORIAL 活动操作:启动平台定义的教程
串 ACTION_USER_FOREGROUND 当用户切换发生时发送,导致进程的用户被带到前台。
串 ACTION_USER_INITIALIZE 发送用户第一次启动时,允许系统应用程序执行一次初始化。
串 ACTION_USER_PRESENT 广播动作:设备醒来后用户在场时发送(例如,当键盘不在时)。
串 CATEGORY_APP_BROWSER 用于ACTION_MAIN启动浏览器应用程序。
串 CATEGORY_HE_DESK_DOCK 设备插入数字(高端)底座时运行的活动。
串 CATEGORY_LE_DESK_DOCK 设备插入模拟(低端)基座时运行的活动。
串 CATEGORY_PREFERENCE 此活动是一个偏好面板。
串 CATEGORY_TAB 打算用作包含TabActivity内的选项卡。
串 EXTRA_ALARM_COUNT AlarmManager在intent中用作一个int外部字段来告诉被调用的应用程序有多少未决的警报正在被意图传递。
串 EXTRA_ASSIST_PACKAGE ACTION_ASSIST包含调用协助时当前前台应用程序包的名称的可选字段。
串 EXTRA_CHANGED_UID_LIST 该字段是一部分 ACTION_EXTERNAL_APPLICATIONS_AVAILABLE, ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE 并且包含已更改的所有组件的整数数组。
INT EXTRA_DOCK_STATE_UNDOCKED 用作int值EXTRA_DOCK_STATE 来表示手机不在任何码头。
串 EXTRA_INITIAL_INTENTS 一个Parcelable [] Intent或者一些 LabeledIntent对象putExtra(String, Parcelable[]),当用户使用a显示给用户时,可以在其中 添加额外的活动来放置选项列表的前面 ACTION_CHOOSER。
串 EXTRA_INTENT 描述您想要显示的选项的意图 ACTION_PICK_ACTIVITY。
串 EXTRA_PHONE_NUMBER 一个保存最初输入的电话号码的字符串ACTION_NEW_OUTGOING_CALL,或实际拨打的电话号码 ACTION_CALL。
串 EXTRA_REPLACING 在ACTION_PACKAGE_REMOVED 意图中用作布尔额外字段以表示这是对包的替换,所以这个广播将立即跟随相同包的不同版本的添加广播。
串 EXTRA_RESTRICTIONS_LIST 额外用于来自处理的BroadcastReceiver的响应 ACTION_GET_RESTRICTION_ENTRIES。
串 EXTRA_SHORTCUT_INTENT 用于定义快捷方式的Intent的额外名称。
串 EXTRA_STREAM 内容:URI保存与Intent关联的数据流,用于提供ACTION_SEND正在发送的数据。
INT FILL_IN_COMPONENT 与使用fillIn(Intent, int),以允许覆盖当前组件值,即使它已经被设置。
INT FILL_IN_SELECTOR 与使用fillIn(Intent, int),以允许覆盖当前的选择,即使它已经被设置。
INT FLAG_ACTIVITY_TASK_ON_HOME 如果在传入的Intent中设置Context.startActivity(),则此标志将导致新启动的任务被放置在当前家庭活动任务(如果有的话)之上。
INT FLAG_RECEIVER_FOREGROUND 如果设置,在发送广播时,允许接收者以前台优先级运行,具有较短的超时间隔。
INT FLAG_RECEIVER_NO_ABORT 如果这是一个有序的广播,不要让接收者中止广播。
后续
可能存在出现错误的地方,欢迎指正,如果对于文章中的某些部分有不同的理解和想法,或者有更好的想法,欢迎留言讨论。这里所介绍的相关知识,只是作者对于数据库中的浅层次理解。希望有经验的朋友们对本文提出宝贵意见,指出其中的纰漏和不足,非常感谢!
关注我,每天都有优质技术文章推送。工作,学习累了的时候放松一下自己。
欢迎大家关注我的微信公众号:「醉翁猫咪」