Intent

http://blog.csdn.net/t12x3456/article/details/7688154

http://blog.csdn.net/harvic880925/article/details/38399723

 

Intent的Data属性
data属性指定所操作数据的URI。 data经常与action配合使用, 如果action为ACTION_EDIT,data的值应该指明被编辑文档的URI; 如果
action为ACTION_CALL,data的值应该是一个以"tel:"开头并在其后附加号码的URI; 如果action为ACTION_VIEW,data的值应该是一个以"http:"开头并在其后附加网址的URI。

· android:host 匹配url中的主机名部分,如“google.com”,如果定义为“*”则表示任意主机名

· android:port 匹配url中的端口

· android:path 匹配url中的路径

在XML中声明可以操作的data域应该是这样的:

1. <activity android:name=".TargetActivity">  

2. <intent-filter>  

3.     <action android:name="com.scott.intent.action.TARGET"/>  

4.     <category android:name="android.intent.category.DEFAULT"/>  

5.     <data android:scheme="scott" android:host="com.scott.intent.data" 

6. android:port="7788" android:path="/target"/>  

7. </intent-filter>  

8. </activity> 

不过有时候对path限定死了也不太好,比如我们有这样的url:(scott://com.scott.intent.data:7788/target/hello)(scott://com.scott.intent.data:7788/target/hi)

这个时候该怎么办呢?我们需要使用另外一个元素:android:pathPrefix,表示路径前缀。
我们把android:path="/target"修改为android:pathPrefix="/target",然后就可以满足以上的要求了。

代码中添加:

1. Intent intent = new Intent("com.scott.intent.action.TARGET");  

2. intent.setData(Uri.parse("scott://com.scott.intent.data:7788/target"));


Intent类的setData()方法用于设置data属性,setType()方法用于设置data的MIME类型,setDataAndType()方法可以同时设定两者。可以通过getData()方法获取data属性的值, 通过getType()方法获取data的MIME类型。这个标识比较特殊,它定义了执行此Activity时所需要的数据,也就是说,这些数据是必须的!!!!!所有如果其它条件都足以激活该Activity,但intent却没有传进来指定类型的Data时,就不能激活该activity!


Intent的Extra属性
通过Intent启动一个component时, 经常需要携带一些额外的数据过去。携带数据需要调用Intent的putExtra()方法, 该方法存在多个重载方法, 可用于携带基本数据类型及其数组, String类型及其数组,  Serializable类型及其数组,Parcelable类型及其数组, Bundle类型等。Serializable和Parcelable类型代表一个可序列化的对象, Bundle与Map类似,可用于存储键值对。
Intent的Flag属性
flag属性是一个int值, 用于通知Android系统如何启动目标activity,或者启动目标activity之后应该采取怎样的后续操作。所有的flag都在Intent类中定义, 部分常用flag如下:
FLAG_ACTIVITY_NEW_TASK--通知系统将目标activity作为一个新task的初始activity;
FLAG_ACTIVITY_NO_HISTORY--通知系统不要将目标activity放入历史栈中;
FLAG_FROM_BACKGROUND通知系统这个Intent来源于后台操作, 而非用户的直接选择

Intent的Category属性

category的作用:提供将要执行的action的额外信息即这个activity在哪个环境中才能被激活。不属于这个环境的,不能被激活。
category属性也是一个字符串, 用于指定一些目标组件需要满足的额外条件。 Intent对象中可以包含任意多个category属性。 Intent类也预定义了一些category常量, 开发者也可以自定义category属性。Intent类的addCategory()方法为Intent添加Category属性,getCategories()方法用于获取Intent中封装的所有category。
以下是Intent类中预定义的部分category:
CATEGORY_HOME--表示目标activity必须是一个显示homescreen的activity;
CATEGORY_LAUNCHER--表示目标activity可以作为task栈中的初始activity,常与ACTION_MAIN配合使用;
CATEGORY_GADGET--表示目标activity可以被作为另一个activity的一部分嵌入。

 

Intent的Action属性
action属性是一个字符串, 代表某一种特定的动作。 Intent类预定义了一些action常量, 开发者也可以自定义action。一般来说, 自定义的action应该以application的包名作为前缀, 然后附加特定的大写字符串Intent类的setAction()方法用于设定action,getAction()方法可以获取Intent中封装的action。该标识用来说明这个activity可以执行哪些动作,所以当隐式intent传递过来action时,如果跟这里<intent-filter>所列出的任意一个匹配的话,就说明这个activity是可以完成这个intent的意图的,可以将它激活!

两条原则:

· 一条<intent-filter>元素至少应该包含一个<action>,否则任何Intent请求都不能和该<intent-filter>匹配。

· 如果Intent请求的Action和<intent-filter>中个任意一条<action>匹配,那么该Intent就可以激活该activity(前提是除了action的其它项也要通过)。

两条注意:

如果Intent请求或<intent-filter>中没有说明具体的Action类型,那么会出现下面两种情况。

·  如果<intent-filter>中没有包含任何Action类型,那么无论什么Intent请求都无法和这条<intent-filter>匹配。

·  反之,如果Intent请求中没有设定Action类型,那么只要<intent-filter>中包含有Action类型,这个Intent请求就将顺利地通过<intent-filter>的行为测试。

 

Intent的Component属性
Intent对象的setComponent(ComponentNamecomp)方法用于设置Intent的Component属性。

ComponentName(Context pkg, Class<?> cls)

从上下文和类对象创建一个新的组件标识符。

ComponentName(Context pkg, String cls) 

从上下文和类名称创建一个新的组件标识符。

ComponentName(Parcel in) 

实例化一个新的componentname从包裹以前写的writetoparcel数据(包裹,int)。

ComponentName(String pkg, String cls) 

创建一个新的组件标识符。

由以上的构造器可知, 创建一个ComponentName对象需要指定包名和类名--这就可以唯一确定一个组件类, 这样应用程序即可根据给定的组件类去启动特定的组件。例如:
ComponentName comp =new ComponentName(FirstActivity.this,SecondActivity.class);
Intent intent = newIntent();
intent.setComponent(comp);

new Intent().putExtra("a", "aa");等价于

Bundle b=new Bundle();

b.putString("a", "aa");

new Intent().putExtras(b);

startActivity(new Intent(packageContext, cls));等价于

new Intent().setClass(packageContext, cls);

startActivity(intent);

intent可以通过intent-filter隐形调用,常用方法如下:

private final static String MY_ACTION = "com.example.ACTION.other";

Intent intent1 = new Intent();

intent1.setAction(MY_ACTION);

startActivity(intent1);

同时配置manifest.xml:

        <activity android:name="com.example.demo04.OtherActivity">

            <intent-filter>

                <action android:name="com.example.ACTION.other" />

                <category android:name="android.intent.category.DEFAULT" />

            </intent-filter>

        </activity>

android.intent.category.DEFAULT的用途和使用

1、要弄清楚这个问题,首先需要弄明白什么是implicit(隐藏) intent什么是explicit(明确) intent。

     Explicit Intent明确的指定了要启动的Acitivity ,比如以下Java代码:

1. Intent intent= new Intent(this, B.class);  

 Implicit Intent没有明确的指定要启动哪个Activity ,而是通过设置一些Intent Filter来让系统去筛选合适的Acitivity去启动。

2、intent到底发给哪个activity,需要进行三个匹配,一个是actioncategory,data。

理论上来说,如果intent不指定category,那么无论intent filter的内容是什么都应该是匹配的。但是,如果是implicit intent,Android默认给加上一个CATEGORY_DEFAULT,这样的话如果intent filter中没有android.intent.category.DEFAULT这个category的话,匹配测试就会失败。所以,如果你的 activity支持接收implicit intent的话就一定要在intent filte中加入android.intent.category.DEFAULT。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值