intent的作用
- android中采用了intent机制来进行应用间的交互与通信,同时,也可以进行程序内部activity, service和broadcast receive之间的交互(Content Provider本身就是一种通信机制,不需要再使用intent来进行通信)。
- intent采用的是运行时绑定机制,在运行过程中连接两个不同的组件,应用程序通过intent向android发出某种请求,android会根据意愿的内容来选择适当的组件进行响应。
intent的类型
- 显示intent:通过component组件,确定intent通信双方的对象。
- 隐式intent:不需要设置component,一般通过action,category,data和type等来确定通信的对象。
当通过intent通信时,首先将activity内的intent-filter全部加载到一个表中,然后依次剔除Action不匹配,Uri不匹配和Category不匹配的intent-filter,最后根据剩下的intent-filter的优先级来返回。如果没有intent-filter剩余,则抛出异常;如果剩下的intent-filter的优先级都相等,则都返回并由用户进行选择。
intent使用方法(隐式intent,以Activity为例)
- 注册intent-filter:在manifest文件中,对应的activity下注册对应的intent-filter
<intent-filter>
<action android:name="action"/>
<category android:name="category"/>
<data android:/>
</intent-filter>
其中intent-filter即intent的过滤器,当应用程序通过startActivity发送intent时,android会根据信息选择最合适的activity并启动。
- 声明intent对象并绑定对应参数
Intent mIntent = new Intent();
mIntent.setAction(ActionType);//设置action,如果不想用系统定义的action类型,可以用自己定义的字符串即可。
mIntent.addCategory(Category);//设置category
Uri data = Uri.parse(Uri);
mIntent.setData(data,type);//指定data和对应的type
其中各参数的含义为:
data:用来指定传输的数据的uri,网络为scheme://host:port/path形式;本地为file://path形式。
type:用来指定传输数据的类型
此外,发送方可以通过调用putExtra在intent发送时携带额外的信息,写法与json写法相同
mIntent.putExtra("name",value);
对应的,接收方可以调用getExtras来获取intetn携带的额外信息
Bundle extra = getIntent().getExtras();
value = extra.getString("name");
设置好了intent之后,就可以通过startActivity或者startActivityForResult
来启动新的activity
startActivity(mIntent);
startActivityForResult(mIntent,requestCode);
其中startActivityForResult显然是多了一个返回值,不过是异步获取的,因此就需要在当前的activity中设置接收返回数据的函数
void onActivityResult(int requestCode, int resultCode, Intent data);
同时在新的Activity中设置返回数据的函数
void setResult(int resultCode, Intent data);
需要注意的是:在onActivityResult函数中,有两个参数,分别是
- requestCode:确定请求的发出方
- resultCode:标记结果的返回方。
比如在一个Activity内,有两个button请求开启一个activity,那么数据返回时,针对同样来源的返回数据,requestCode就标记了打开本Activity 的Button。
同样的,如果一个Button可以打开不同的Activity,那么对于不同的Activity,针对本Button都会返回数据,那么resultCode就标记了是哪一个Activity返回的。
//在当前activity中重写onActivityResult函数
public void onActivityResult(int requestCode,int resultCode,Intent data){
switch(requestCode){
case requestCode1:
//TODO
break;
case requestCode2:
//TODO
break;
default:
break;
}
}
//在新的Activity中调用setResult函数
NewActivity.this.setResult(resultCode,intent);//此处intent不需要指定action等信息
demo地址:https://github.com/zhufeizhu/android_demo/tree/master/intent_test