intent :
1 作用:intent提供了一种通用的消息系统,它允许你的应用程序与其他应用程序间传递Intent来执行动作和产生事件
2 intent包含内容:action(要执行的动作),data,category(类别,被执行动作的附加信息),component(指定intent的目标组件的类名称),extra,type(数据类型)
Action,也就是要执行的动作(系统)
constant | Target component | Action |
ACTION_CALL | activity | Initiate a phone call. |
ACTION_EDIT | activity | Display data for the user to edit. |
ACTION_MAIN | activity | Start up as the initial activity of a task, with no data input and no returned output. |
ACTION_SYNC | activity | Synchronize data on a server with data on the mobile device. |
ACTION_BATTERY_LOW | broadcast receiver | A warning that the battery is low. |
ACTION_HEADSET_PLUG | broadcast receiver | A headset has been plugged into the device, or unplugged from it. |
ACTION_SCREEN_ON | broadcast receiver | The screen has been turned on. |
ACTION_TIMEZONE_CHANGED | broadcast receiver | The setting for the time zone has changed. |
Data,也就是执行动作要操作的数据
Android中采用指向数据的一个URI来表示,如在联系人应用中,一个指向某联系人的URI可能为:content://contacts/1。对于不同的动作,其 URI数据的类型是不同的(可以设置type属性指定特定类型数据)。如:打电话为tel:URI,访问网络为http:URI,而由content provider提供的数据则为content: URIs。
一般情况下Date属性通常用于向Action属性提供操作的数据。
URI描述 | 动作 | 说明 |
http://web_address | android.intent.action.VIEW | 启动Web浏览器 |
content://contacts/people/1 | android.intent.action.EDIT | 更新id=1的联系人数据 |
content://contacts/people/ | android.intent.action.VIEW | 浏览所有人的数据 |
tel:123 | android.intent.action.CALL | 拨打电话 |
tel:123 | android.intent.action.VIEW | 浏览电话123的数据 |
content://contacts/people/1 | android.intent.action.DIAL | 拨打id=1的联系人电话 |
type(数据类型),显式指定Intent的Date所指定Uri对应的数据类型(MIME)。一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。
category(类 别),被执行动作的附加信息。例如 :action为ACTION_MAIN,category为LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher中作为顶级应用出现;action为ACTION_MAIN,category为CATEGORY_HOME,显示桌面。而ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个,这 些动作可以在同一块数据上执行。还有其他的为
Constant | Meaning |
CATEGORY_BROWSABLE | The target activity can be safely invoked by the browser to display data referenced by a link — for example, an image or an e-mail message. |
CATEGORY_GADGET | The activity can be embedded inside of another activity that hosts gadgets. |
CATEGORY_HOME | The activity displays the home screen, the first screen the user sees when the device is turned on or when the HOME key is pressed. |
CATEGORY_LAUNCHER | The activity can be the initial activity of a task and is listed in the top-level application launcher. |
CATEGORY_PREFERENCE | The target activity is a preference panel. |
component(组件),指定Intent的目标组件的类名称。通常 Android会根据Intent 中包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。但是,如果 component这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的。
extras(附加信息),是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。
注意:
我们需要什么时候加android.intent.category.DEFAULT呢?
1、要弄清楚这个问题,首先需要弄明白什么是implicit(隐藏) intent什么是explicit(明确) intent。
Explicit Intent明确的指定了要启动的Acitivity,比如以下Java代码:
Intent intent= new Intent(this, B.class)
Implicit Intent没有明确的指定要启动哪个Activity ,而是通过设置一些Intent Filter来让系统去筛选合适的Acitivity去启动。
2、intent到底发给哪个activity,需要进行三个匹配,一个是action,一个是category,一个是data。
理论上来说,如果intent不指定category,那么无论intent filter的内容是什么都应该是匹配的。但是,如果是implicit intent,android默认给加上一个CATEGORY_DEFAULT,这样的话如果intent filter中没有android.intent.category.DEFAULT这个category的话,匹配测试就会失败。所以,如果你的 activity支持接收implicit intent的话就一定要在intent filter中加入android.intent.category.DEFAULT。
例外情况是:android.intent.category.MAIN和android.intent.category.LAUNCHER的filter中没有必要加入android.intent.category.DEFAULT,当然加入也没有问题。
1 不同Activity跳转,显式意图和隐式意图
2 显示意图:
Intent i=newIntent();
i.setClass(MainActivity.this, SecondActivity.class);
startActivity(i);
Intent i=newIntent();
i.setComponent(new ComponentName(SecondActivity.this, ThirdActivity.class));
startActivity(i);
i.setClassName(SecondActivity.this,ThirdActivity.class.getName());
3 隐式意图:注意activity必须设置DEFAULT类型
i.setAction("hello");
i.addCategory("abc");
startActivity(i);
<intent-filter>
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="hello"/>
<category android:name="abc"/>
</intent-filter>
举例:
如果在activity中通过如下隐式意图的代码启动一个activity
Intent i = new Intent();
i.setAction(Intent.ACTION_CALL);
i.setData(Uri.parse("tel:222"));
startActivity(i);
在打电话的应用中,打电话的activity界面的manifest配置应该如下:
<intent-filter>
<action android:name="android.intent.action.CALL" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="tel" />
</intent-filter>
举例:
Intent intent = newIntent();
intent.setAction("com.hoo.kay");
//设置数据URI与数据类型匹配
//intent.setData(data);
//intent.setType(type);注意这个方法会清除setData的内容,所以如果既要设置类型与数据,那么使用setDataAndType
intent.setDataAndType(Uri.parse("hoo://www.hoo.com/person"), "image/gif");
startActivity(intent);
被隐式启动的activity的配置:
<activityandroid:name="Intent2DateActivity">
<intent-filter>
<action android:name="com.hoo.kay"/>
<categoryandroid:name="android.intent.category.DEFAULT"/>
<data android:host="www.hoo.com" android:scheme="hoo" android:mimeType="image/gif" android:path="/person"/>
</intent-filter>
</activity>
注意:
对于一个Action字符串,系统有可能会找到一个Activity能处理这个Action,也有可能找到多个Activity,也可能一个都找不到。
1、找到一个Activity
很简单,直接打开这个Activity。这个不需要解释。
2、找到多个Acyivity
系统会提示从多个activity中选择一个打开。
3、一个Activity都没找到
一个都没找到的话,程序就会出错,会抛出ActivityNotFoundException。比如随便写一个action字符串:
4 传递数据:
5 普通的数据:两种方式:Bundle、putExtra
Activity 关闭后返回的数据: