Android为我们提供了Intent这个组件,Intent本身是一个消息传递的载体,来方便我们进行组件之间的通信以及数据的传输。
通过查看官方的文档,会发现Intent的用法很多,为了方便查阅,自己做了简化和整理。
Intent包含的信息
1:动作(action),这是Intent最重要的一个信息,一个Intent被创建的主要目的就是利用该Intent去执行这个动作。可以通过setAction(ACTION字段)
方法来设置。可以自定义动作,但是注意要以自己的包名为前缀。
2:数据(data),这个数据是用于Intent与android系统交互的数据。它是一个Uri对象。可以调用setData(Uri uri)
来设置。对于设置的Uri对象来说,要想更加准确地匹配到对应的组件,还应该为其添加MIME类型,这个类型可以更加详细的表明该数据的类型,进而达到准确匹配的目的。可以用setType()
方法来添加MIME类型。
3:类别:(category),它是包含了应处理Intent组件类别的附加信息的字符串,可以调用addCategory()
方法设置。但是大多数的Intent并不需要添加额外的类别信息。
4:额外信息(Extra),Extra主要是为了方便Intent携带一些简单的数据,来方便组件之间的通信,这些数据以K-V的形式被存储在Intent中。还可以通过Bundle对象携带所有的Extra数据,然后让Intent对象携带Bundle对象来传递数据。
5:标志(Flag) ,标志用的地方不多,就不说了。用到了再写。
组件通信
1:activity之间的通信,当一个activity想要启动另外一个activity的时候,我们可以采用Intent。
intent myIntent = new Intent();
myIntent.setAction(com.example.MyDemo.STARTACTIVITY);
startActivity(myIntent);
2:发送广播,可以通过sendBroadcast(Intent Intent)
来将数据信息作为广播发送出去。
3:启动服务,可以通过startService(Intent Intent)
来启动服务。而且在服务绑定中,也需要用到Intent。
Intent可以分为显式和隐式Intent。对于显式Intent来说,它要启动的组件是明确申明的,所以不需要过多的解释,而且,对于显式Intent来说,不需要配置Intent过滤器。
对于隐式Intent来说,不会明确指出要启动的组件,比如activity,我们需要配置Intent过滤器来让activity响应具体的Intent请求。
<activity android:name="ShareActivity">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
</intent-filter>
</activity>
Intent可以返回数据给它的上一个活动,这个需要在启动活动的时候不能直接使用startActivity()
方法,而是使用startActivityForResult(intent ,requestCode)
方法,其中的requestCode是用来判断返回的数据的类型的,因为假如有多个Intent对象返回,可以根据requestCode来判断哪个是我们需要的Intent。但是,到这儿还没有结束,因为返回来的数据我们还没有处理。这个时候,我们还需要重写onActivityResult(int requestCode,int resultCode,Intent data)
方法,在里面我们就可以对返回来的数据进行处理了。
int requestCode = 1;//请求码
Intent intent = new Intent();
intent.setAciton(my.example.MyDemo.STARTACTIVITY);
startActivityForResult(intent,requestCode);
//处理返回来的数据
protected void onActivityResult(int requestCode,int resultCode,Intent data){
switch(requestCode){//根据请求码来得到对应请求的数据
case 1:
if(resultCode == RESULT_OK){
//resultCode用来判断请求结果是否成功
//处理数据,
}
break;
}
}
被请求的activity返回数据:
//省略其他代码
//返回数据的代码
Intent intent = new Intent();
intent.putExtra("data_return","hello world");//利用putExtra()将数据添加到Intent中
setResult(RESULT_OK,intent);//利用setResult()将携带数据的Intent返回给调用者。
当被请求数据的activity被销毁的时候,它会先回调请求数据的activity的onActivityResult()
方法来将数据返回给上一个activity。