android基本的设计理念是鼓励减少组件间的耦合,因此android提供了Intent(意图),用意图激活其他组件。Intent提供了一种通用的消息系统,它允许在你的应用程序与其他应用程序间传递Intent来执行和产生事件。使用Intent可以激活android应用的三个核心组件:活动、服务和广播接收器。Intent代表了要执行的某一种想法,要干的某一件事情。
意图可划分为显式意图和隐式意图。
显示意图:
Intent.setClassName(packageName,className)不指定动作和数据,直接指定需要操作的组件。
等于该语句:new Intent(this,CalcActiviy.class)
packageName:当前包名,可以使用getPackageName()获得
className:需要激活的组件必须要与清单文件中的类名一致
例如:com.itheima.rpcalc.CalcActiviy
开启界面的方法startActivity(intent)
隐式意图:
每次创建一个新的activity界面都要记得在manifest文件中声明一下
在intent-filter节点中
action节点下 android.name一般前面跟包名,后面指定要完成的动作
使用隐式意图开启界面的时候需要指定<action/> <data/> <category/>节点
其中data节点对应setType
Intent.setAction(action)
Intent.setDate(date)
隐式意图相对于显示意图更加灵活一点
代码展示:
在FirstActivity中点击按钮跳到SecondActivity中(用隐式意图):
在AndroidManifest中
< activity android:name=".SecondActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="cn.itcast.xiao.li" />
<action android:name="cn.itcast.xiao.zhang" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="cn.itcast.category.li" />
<data android:scheme="itcast"
android:host="www.itcast.cn"
android:path="/person"/>
<data android:mimeType="image/gif"/>
</intent-filter>
代码:onCreate部分 public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) this.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("cn.itcast.xiao.li");
intent.setDataAndType(Uri.parse("itcast://www.itcast.cn/person"), "image/gif");
startActivity(intent);
}
});
}
其中,action的name随便设,category的name也可以随便设,不过android.intent.category.DEFAULT是调用startActivity时内部自动生成的。 在意图过滤器中可以有多个动作和类别,但意图只能定义一个动作,所以只要定义的这个动作(action)和意图过滤器中的任意一个匹配就可以成功。类别(category)也是,只要匹配其中一个就行,不必匹配所有。但是,如果定义的类别在意图过滤器中找不到,就会报错,也就是说意图中定义的动作和意图在过滤器中必须有。 注意:若intent.setDataAndType(Uri.parse("itcast://www.itcast.cn/person"), "image/gif");分开写,即:intent.setData(),intent.setType()(括号中的东西略)时,就算是都匹配也会报错。原因:在setType()文档中有一句话,This method automatically clears any data that was previously set by setData(Uri).也就是说,当设置了setType时会自动清除setData中的内容。所以,解决方法:写成intent.setDataAndType(Uri.parse("itcast://www.itcast.cn/person"), "image/gif");这样就正确了。
总结:
显示意图:必须制定要激活的组件的完整包名和类名
(一般激活自己应用的组件的时候采用显示意图)
隐式意图:只需要指定需要完成的动作和数据就行
(好处是应用程序之间没有耦合,激活别人写的应用,隐式意图不需要关心对方的包名和类名)