Intent
显式Intent:
通过组件名指定启动的目标组件,比如startActivity(new Intent(A.this,B.class));
每次启动的组件只有一个~
隐式显式Intent:
不指定组件名,而指定Intent的Action,Data,或Category,当我们启动组件时,
会去匹配AndroidManifest.xml相关组件的Intent-filter,逐一匹配出满足属性的组件(必须Action和Category同时匹配上算匹配成功),当不止一个满足时, 会弹出一个让我们选择启动哪个的对话框~
具体用法
//FirstActivity中
Intent intent = new Intent("com.example.intentdemo.ACTION_START");
//action和category同时匹配上了才能启动activity
intent.addCategory("com.example.intentdemo.CATEGORY1");//一个Intent只可以有一个Category
intent.setData(Uri.parse("http://www.baidu.com"));
//AndroidManifest.xml中
<activity android:name=".SecondActivity" >
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.example.activitytest.MY_CATEGORY"/>
<data
android:host="com.example.project"
android:path="/folder/subfolder/etc"
android:port="200"
android:scheme="http" />
</intent-filter>
</activity>
data标签的使用
android:scheme。用于指定数据的协议部分,如上例中的 http 部分。
android:host。用于指定数据的主机名部分,如上例中的 www.baidu.com 部分。
android:port。用于指定数据的端口部分,一般紧随在主机名之后。
android:path。用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。
android:mimeType。用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
组件中启动的方法
startActivity(Intent) / startActivityForResult(Intent):来启动一个Activity
startService(Intent)/bindService(Intent):来启动一个Service
sendBroadcast(Intent):发送广播到指定BroadcastReceiver
使用Intent传递数据数据
- 基本数据可以直接调用putExtra(key,value)方法,然后取的时候通过getXxxExtra(key)方法进行取值,其中Xxx为value的类型。
- 调用setData(URI uri)方法,参数需要URI,然后取的时候调用getData,返回类型为URI。
- 传递对象
方式1:Serializable
将需要传递对象的实体类实现java.io.Serialization接口(序列化,不需要重写任何方法然后在取的地方使用
Person person = (Person) getIntent().getSerializableExtra("person_data");
补充:
序列化:一个用于将对象状态转换为字节流的过程,可以将其保存到磁盘文件中或通过网络发送到任何其他程序;
反序列化:从字节流创建对象的相反的过程称为反序列化。
方式2:Parcelable
实体类实现Parcelable接口,重写以下方法
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name); // 写出 name
dest.writeInt(age); // 写出 age
}
public static final Parcelable.Creator<Person> CREATOR = new Parcelable.
Creator<Person>() {
@Override
public Person createFromParcel(Parcel source) {
Person person = new Person();
person.name = source.readString(); // 读取 name
person.age = source.readInt(); // 读取 age
return person;
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
取的时候用:
Person person = (Person) getIntent().getParcelableExtra("person_data");
比较和选用
Serializable 的方式较为简单,但由于会把整个对象进行序列化,因此效率会比 Parcelable 方式低一些,所以在
通常情况下还是更加推荐使用 Parcelable 的方式来实现 Intent 传递对象的功能。