- Intent可以用来启动Activity(startActivity(Intent))、Serveice(startService(Intent))等组件,可以用作绑定Activity和Service以建立它们之间的通信(bindServiceConnaction(Intent,ServiceConnection,int)),可以作为broadcastIntent发送给广播接收器(sendBroadcast(Intent))。
主要属性
|
| ||||||||||||||||||||||||||||||||||||||
次要属性
|
|
- IntentFilter意图过滤器要匹配Intent,需要在Manifest.xml文件中指明相应的Action、Categroy、Type(这是一种Data的属性)来过滤匹配,如果一个Intent包涵多个Category属性,那么想要匹配它的组件就需要在<intent-filter>标签中也同样指明这些属性。
- 如果没有明确的指定Intent的指向Data数据的Uri,那么可以给他指定Uri的属性,包括:scheme、host、port、path。一条Uri的结构是这样的:<scheme>://<host>:<port>/<path>
<data android:scheme="content"
android:host="com.icechen.mydemo"
android:port="200"
android:path="/folder/subfolder/etc"/>Uri的这几个属性是线性关系,上一级未指定,那么下一级就会失效。
当一个意图过滤器IntentFilter包含Uri其中一个或多个属性时,拥有这些属性的Intent将都能通过过滤器。
- 通过setFlags(int)或者addFlags(int)可以把标签flags用在Intent中。
Intent(Intent o)
| 通过复制一个Intent来构造 |
Intent(String action)
| 构造一个指定action的Intent对象 |
Intent(String action,Uri uri)
|
构造一个指定action,并且有指向数据的uri的Intent对象
|
Intent(Context packageContext,Clsaa<?>class)
|
构造一个有指定Component属性的Intent
|
Intent(String action,Uri uri,Context packageContext,Class<?>class)
|
构造一个有指定的Conponent属性,并且有指定action和指定data的uri的Intent
|
常用方法:
addCategory(String Category)
|
添加一条Category属性
|
addFlags(int Flags)
| 添加一条Flag标签 |
clone()
| 复制一个Object类型的对象 |
getExtras()
|
获得一个Bundle对象
|
getSourceBounds()
|
获得发送Intent的组件的边界坐标
|
makeMainActivity(ComponentName mainActivity)
| 创建一个Category属性为luancher的Intent去启动mainActivity |
parseUri(String uri,int flags)
|
通过解析一个uri获得一个Intent对象
|
setComponent()
|
添加component属性
|
setClass()
|
相当于添加component属性
|
setClassName()
|
相当于添加component属性
|
resolveActivity(PackageManager)
|
解析Intent启动的Activity,返回ComponentName对象
|
createChooser(Intent target,CharSequence title) | 创建一个有选择对话框的Intent |
getData()、setType()
getData()、getType()
| 设置/获得Data/Type类型的数据 |
Intent的两种主要形式:
显示意图Explicit Intent:
直接指定了Intent的Component属性。
如果不想app中的组件被其他app启动,在manifest.xml中将组件的android:explicit属性设置为false。
Intent i = new Intent(Context,Activity.class); //注意,此处名字必须与java文件完全一致。
隐式意图Implicit Intent:
没有指定Component属性,所以它必须包含足够的信息去告诉System应该去匹配运行哪一个组件。
- 启动Service只能使用Explicit显示意图,否则在Android5.0以后会报错。在<service>标签中,不要添加意图过滤器,即<intent-filter>标签。
- 当需要同时设置Intent的Type类别和Uri类别时,只能使用setDataAndType(Uri data,String type)方法,分开设置是无效的。
- 当使用implicit隐式意图去启动一个app时,应该调用Intent对象的resolveActivity(getPackageManager)来获取所启动的类,并判断是否存在,如果不存在需要程序会崩溃;所以需要判断返回的对象不为空后才能调用startActivity(Intent)。
- 使用createChooser(Intent,charSequence)方法创建Intent,然后调用startActivity(),当有多个匹配时,会弹出选择对话框供用户选择。
- PackageManager提供了一系列查询可以响应Intent的组件的方法:queryIntentActivity()、queryIntentServices()、queryBroadcastReceiver()。
- Panding Intent?
使用Intent的Extral属性传递数据:
i.putExtral(键,值);//在意图中绑定一个数据,
参数说明:
第一个参数是第二个参数的标签;
第二个参数是要传递的值。
startActivity(i);//启动一个Activity。
i = getIntent();//获得启动该活动的Intent对象。
i.getObjexctExtra(键);//获得Intent对象中的指定数据。
参数说明:
该参数就是之前定义的键,通过该方法来获得其对应的数据。
使用Bundle类(一个数据包)传递数据:
传出时:
Boudle bundle1 = new Bundle();//创建一个Bundle对象。
bundle1.put(键1-值1);把一个键值数据对添加到Bundle对象中。
bundle1.put(键2-值2);
Bundle bundle2 = new Bundle();
bundle1.put(bundle2);//bundle中可以装Bundle对象。
i.putExtras(bundle1);//把数据包附加在Intent对象上。
i.purExtra(键-bundle1);//把Bundle对象作为键值对附加在Intent对象上。
接收时:
Bundle b = i.getExtras();//从Intent对象中获取Bundle对象(数据包)。
b.getObject(键);//获得数据包中,该键的值。
b.getObject(键,默认值);//当值不存在时,则设置为默认值。
Bundle b2 = i.getExtraBundle();//获得键值对中的Bundle对象。可以传递复杂数据。
使用Serializable(流.note )和Pacelable接口序列化对象来传递对象:
class A implemernts
Serializable{};//这种方法传输A类对象时,效率较低,但无需重写其方法。
传递/获得对象的方法:
i.putSerializableExtra(键-值));
i.getSerializableExtra(键);
bundle1.putSerializable(键-值);
bundle1.getSerizlizable(键);
class A implements
Parcelable{};//这种方法效率较高,但是要
重写2个方法:
public int
describeContents(){
return 0; //这个方法这样些就行了
}
public void writeToParcel(Parcel dest,int flage){
dest.writeObject1(Object的Object1类型参数);
dest.writeObject2(Object的Object2类型参数); //写出该类的对象的参数(通过该类的getExmple()方法获得数据)
}
还需要添加一个对象:
public static final Parcelable.Creator<Object>
CREATOR
= new Creator<Object>(){
public Object createFromParcel(Parcel source){
return new Object(source.readObject1,source.readObject2);
//这里是用实现Parcalable接口的对象的参数来新建一个对象,把它作为返回值。相当于从parcel中取出对象。
}
public Object[] newArray(int size){
return new Object[size];
}
注意:上面的红色部分一定要大写,否则会报错!writeToParcel()和createFromParcel()的先后顺序需要对应。implements的对象不适用于存盘操作。
传递/获得对象的方法:
i.putParcelableExtra(键-值);
i.getParcelableExtra(键);
bundle1.putParcelable(键-值);
bundle1.getParcelable(键);
由A启动B,再由B返回一个数据给A的操作:
B这边:
Intent i = getIntent();
i.putExtra(键-值);
setResult(1,i); //由这个方法返回一个数据给A
A这边:
Intent i = new Intent();
startActivityForResult(i,0); //使用这种方法才能接收B返回的数据。
重写方法:
protected void
onActivityResult(int requstCode,int resultCode,Intent data){
super.onActivityResult(requestCode,resultCode,data);
}
参数说明:
第一个参数是A中的请求码,对应0;
第二个参数是B中的返回码,对应1;
第三个参数为B中的Intent对象。
Intent相关的一些方法:
getIntent():获得启动这个Activity的意图。