Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 484|回复: 0

[实例教程]Android中怎么样来解析Intent

[复制链接]

该用户从未签到

发表于 2011-10-22 12:47:56 | 显示全部楼层 |阅读模式
  在应用中,我们可以以两种形式来使用Intent:

  直接Intent:指定了component属性的Intent(调用setComponent(ComponentName)或者setClass(Context, Class)来指定)。通过指定具体的组件类,通知应用启动对应的组件。

  间接Intent:没有指定comonent属性的Intent。这些Intent需要包含足够的信息,这样系统才能根据这些信息,在在所有的可用组件中,确定满足此Intent的组件。

  对于直接Intent,Android不需要去做解析,因为目标组件已经很明确,Android需要解析的是那些间接Intent,通过解析,将 Intent映射给可以处理此Intent的Activity、IntentReceiver或Service。

  Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent,最终找到匹配的Intent。在这个解析过程中,Android是通过Intent的action、type、category这三个属性来进行判断的,判断方法如下:

  如果Intent指明定了action,则目标组件的IntentFilter的action列表中就必须包含有这个action,否则不能匹配;

  如果Intent没有提供type,系统将从data中得到数据类型。和action一样,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。

  如果Intent中的数据不是content: 类型的URI,而且Intent也没有明确指定它的type,将根据Intent中数据的scheme (比如 http: 或者mailto: ) 进行匹配。同上,Intent 的scheme必须出现在目标组件的scheme列表中。

  如果Intent指定了一个或多个category,这些类别必须全部出现在组建的类别列表中。比如Intent中包含了两个类别:LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别。

       应用例子

  以下,以Android SDK中的便笺例子来说明,Intent如何定义及如何被解析。这个应用可以让用户浏览便笺列表、查看每一个便笺的详细信息。

java代码: <manifest

xmlns:android="http://schemas.android.com/apk/res/android"

package="eoe.demo">

<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:value="android.intent.action.MAIN"

/>

<category

android:value="android.intent.category.LAUNCHER"

/>

</intent-filter>

<intent-filter>

<action

android:value="android.intent.action.VIEW"

/>

<action

android:value="android.intent.action.EDIT"

/>

<action

android:value="android.intent.action.PICK"

/>

<category

android:value="android.intent.category.DEFAULT"

/>

<type

android:value="vnd.android.cursor.dir/vnd.google.note"

/>

</intent-filter>

<intent-filter>

<action

android:value="android.intent.action.GET_CONTENT"

/>

<category

android:value="android.intent.category.DEFAULT"

/>

<type

android:value="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:value="android.intent.action.VIEW"

/>

<action

android:value="android.intent.action.EDIT"

/>

<category

android:value="android.intent.category.DEFAULT"

/>

<type

android:value="vnd.android.cursor.item/vnd.google.note"

/>

</intent-filter>

<intent-filter>

<action

android:value="android.intent.action.INSERT"

/>

<category

android:value="android.intent.category.DEFAULT"

/>

<type

android:value="vnd.android.cursor.dir/vnd.google.note"

/>

</intent-filter>

</activity>
java代码: <activity

class=".TitleEditor"

android:label="@string/title_edit_title"

android:theme="@android:style/Theme.Dialog">

<intent-filter

android:label="@string/resolve_title">

<action

android:value="com.google.android.notepad.action.EDIT_TITLE"

/>

<category

android:value="android.intent.category.DEFAULT"

/>

<category

android:value="android.intent.category.ALTERNATIVE"

/>

<category

android:value="android.intent.category.SELECTED_ALTERNATIVE"

/>

<type

android:value="vnd.android.cursor.item/vnd.google.note"

/>

</intent-filter>

</activity>



</application>

</manifest>
例子中的第一个Activity是com.google.android.notepad.NotesList,它是应用的主入口,提供了三个功能,分别由三个 intent-filter进行描述:

        1、第一个是进入便笺应用的顶级入口(action为android.app.action.MAIN)。类型为android.app.category.LAUNCHER表明这个Activity将在Launcher中列出。

        2、第二个是,当type为vnd.android.cursor.dir/vnd.google.note(保存便笺记录的目录)时,可以查看可用的便笺(action为android.app.action.VIEW),或者让用户选择一个便笺并返回给调用者(action为 android.app.action.PICK)。

        3、第三个是,当type为vnd.android.cursor.item/vnd.google.note时,返回给调用者一个用户选择的便笺(action为android.app.action.GET_CONTENT),而用户却不需要知道便笺从哪里读取的。有了这些功能,下面的 Intent就会被解析到NotesList这个activity:

java代码: { action=android.app.action.MAIN }:

//与此Intent匹配的Activity,将会被当作进入应用的顶级入口。





{ action=android.app.action.MAIN, category=android.app.category.LAUNCHER }:

//这是目前Launcher实际使用的 Intent,用于生成Launcher的顶级列表。





{ action=android.app.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 }:

//和上面的action为pick的Intent类似,不同的是这个Intent允许调用者(在这里指要调用NotesList的某个 Activity)指定它们需要返回的数据类型,系统会根据这个数据类型查找合适的 Activity(在这里系统会找到NotesList这个Activity),供用户选择便笺。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-22 16:47 , Processed in 0.360371 second(s), 46 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表