android桥梁之Intent

版权声明:欢迎转载,共同进步,麻烦注明转载出处 https://blog.csdn.net/Hanxiaofan95/article/details/83060684

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。

猜你喜欢

转载自blog.csdn.net/Hanxiaofan95/article/details/83060684