定义,使用范围
Android中提供了Intent机制来协助应用间的交互通讯,不仅可用于应用程序之间,也可用于应用程序内部的activity, service和broadcast receiver之间的交互。
Intent是一种运行时绑定(runtime binding)机制,它能在程序运行的过程中连接两个不同的组件。
通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来响应。
Intent有以下几个属性:
动作(Action): Action是指Intent要完成的动作,是一个字符串常量。
数据(Data): 执行动作的URI和MIME类型,不同的Action有不同的Data数据指定。
分类(Category): Category属性是一个执行动作Action的附加信息。 每个Intent中只能指定一个action,但却能指定多个category。
类型(Type): Type属性显式指定Intent的数据类型(MIME)。一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。
组件(Compent): Intent的的目标组件的类名称, 指定了这个属性以后,Intent的其它所有属性都是可选的。
扩展信(Extra): 添加一些组件的附加信息。可以启动哪些组件,用什么方法
(1) Activity
Context.startActivity() 或 Activity.startActivityForResult()
(2) Service
Context.startService()或Context.bindService()
(3) Broadcasts
Context.sendBroadcast(),Context.sendOrderedBroadcast()或者
Context.sendStickyBroadcast()显示Intent和隐式Intent
显示Intent:用java代码实现。
如:从MainActivity跳转到SecondActivity
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
隐式Intent:在Android Mainefest.xml中实现,在下的中配置
如:从MainActivity跳转到SecondActivity
<activity
android:name="com.fny.demo. SecondActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
在MainActivity中调用
Intent intent = new Intent("android.intent.action.MAIN");
startActivity(intent);
使用隐式Intent,我们不仅可以启动自己程序内的活动,还可以启动其他程序的活动;
当Intent匹配成功的组件有多个时,显示优先级高的组件,如果优先级相同,显示列表让用户自己选择;
优先级从-1000至1000,并且其中一个必须为负的才有效。
使用Intent调用系统组件
(1) 相册(从gallery选取图片)
Intent intent1 = new Intent(Intent.ACTION_PICK, null);
intent1.setDataAndType(MediaStore.Images.Media.INTERNAL_CONTENT_URI, "image/*");
// INTERNAL_CONTENT_URI是本机图片,图片类型用image
(2) 相机(调用Android设备的照相机,并设置拍照后存放位置)
Intent intent2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent2.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(newFile(Environment.getExternalStorageDirectory(),"head.jpg")));
startActivityForResult(intent2, 2);
// getExternalStorageDirectory()是存储在本机
(3) 拨号,信息
打开拨打电话的界面:
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
直接拨打电话:
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
调用时,要在Android Mainefest.xml添加权限
<uses-permission android:name="android.permission.CALL_PHONE"/>
打开发送短信的界面:
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("smsto: 手机号"));
intent.putExtra("sms_body", "具体短信内容");
//"sms_body"为固定内容
startActivity(intent);
(4) 播放音乐,播放视频
data+type属性的使用实例:播放指定路径的mp3文件
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri data = Uri.parse("mp3所在路径");
intent.setDataAndType(data, "audio/mp3");
startActivity(intent);
- 哪些数据类型能被Intent传送?
(1) 简单或基本数据类型
发送方:
Intent intent = new Intent(this,~.class);
intent.putExtra("key", "value");
startActivity(intent);
接收方:
Intent intent = getIntent();
String name = getStringExtra("key");
(2) 传递一个Bundle
发送方:
Intent intent = new Intent("com.scott.intent.action.TARGET");
Bundle bundle = new Bundle();
bundle.putInt("id", 0);
bundle.putString("name", "scott");
intent.putExtras(bundle);
startActivity(intent);
接收方:
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
int id = bundle.getInt("id");
String name = bundle.getString("name");
(3) 传递Serializable对象
Bundle bundle = new Bundle();
bundle.putSerializable(SER_KEY, Boy );
bundle.putString(intent_type,"Serializable");
intent.putExtras(bundle);
startActivity(intent);
Serializable 对象 Boy 代码如下
public class Boy implements Serializable {
private String name;
private int age;
private String major;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getMajor() {
return major;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setMajor(String major) {
this.major = major;
}
}
(4) Parcelable对象
Bundle bundle = new Bundle();
bundle.putParcelable(PAR_KEY, Girl );
bundle.putString(intent_type,"Parcelable");
intent.putExtras(bundle);
startActivity(intent);
parcelable 对象 Girl 代码如下
public class Girl implements Parcelable {
private String name;
private int age;
private String major;
public static final Parcelable.Creator<Girl> CREATOR = new Parcelable.Creator<Girl>() {
@Override
public Girl[] newArray(int i) {
return new Girl[i];
}
@Override
public Girl createFromParcel(Parcel parcel) {
// Parcelable必须按照变量声明顺序读取或封装数据
Girl girl = new Girl();
girl.setName(parcel.readString());
girl.setAge(parcel.readInt());
girl.setMajor(parcel.readString());
return girl;
}
};
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setMajor(String major) {
this.major = major;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getMajor() {
return major;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
// Parcelable必须按照变量声明顺序读取或封装数据
parcel.writeString(name);
parcel.writeInt(age);
parcel.writeString(major);
}
}