Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent一般可被用于启动活动、启动服务以及发送广播等场景
Intent类的实现非常简单,它并没有包含复杂的逻辑功能,只是包含着若干个数据项
(1)Action项 在Intent中用来表示动作,可以通过Intent的setAction和getAction来进行操作。在Android中定义了很多标准的动作,比如:Intent.ACTION_VIEW等。这些动作约定了 Android组件间的通信规范,保证了组件系统的可扩展性。
(2)Data项,当发起请求时,调用组件如果有明确的数据对象,通常就会用Data项来存储表示。Data数据也是用字符串进行存储,它的格式符合URI标准。所以可以通过URI来描述数据来增强数据的作用范围。
(3)Type项, Type是MINE格式的字符串数据,用于描述组件能够处理的请求类型,或者补充说明Data数据的类型,它可以通过通配符*来表示整个类别的信息。注意:Data项和Type项在很多时候是互斥使用的,当调用Intent.setType时,之前设定的Data信息就会被清空,反之亦然。但可以通过intent.setDataAndType()来同时设置。
(4)Category项 Category表示约束。每个Intent对象可包含多个categroy项。而一个组件需要支持全部的Category才可能处理请求。如一个组件需要启动其他应用,且希望进入的是这个应用的入口组件,这时就需要添加Intent.CATEGORY_LAUNCHER作为约束。
(5)Component项 它指的是目标组件的类型信息,可以通过Intent.setComponent方法利用类名进行设置,也可以通过Intent.setClass方法利用类型对象信息进行设置。
(6)Extras项 Intent中数据传输的载体,负责将数据从调用组件传递到实现组件。
(7)Flags项 Flags是一个整数型,由一系列的标志位汇集而成。
在组件开发中,应该遵循SDK或第三方拟定的相关规范。当一个组件需要支持特定的Action时,就需要同支持相关的Extras项和Data项相关内容。协议的完整性和正确性是整个Android Intent机制的根基。
如果Intent没有包含要启动的组件的完整类名,即:并不明确指出我们想要启动哪一个活动,他的意图表现在指定的一系列抽象的action与category中指定说明该Intent的意图,交由系统分析并执行。
一般,隐式的Intent只用在当我们想在自己的App中通过Intent启动另一个App的组件的时候,让另一个App的组件接收并处理该Intent。
例如,你想在地图上给用户显示一个位置,但是你的App又不支持地图展示,这时候你可以将位置信息放入到一个Intent中,然后给它指定相应的action,通过这样隐式的Intent请求其他的地图型的App(例如Google Map、百度地图等)来在地图中展示一个指定的位置。
我们查看Intent filter中,可看到action 和 category ,那么这个是什么呢
能够匹配你这个组件的标志
例如Intent.ACTION_VIEW,这是一个Android系统内置的动作,其常量值为android.intent.action.VIEW
用于为action添加额外信息,一个intentFilter可以不声明category属性,也可以声明多个category属性。
刚刚说到intent有若干个数据项,action 、category 是其中之一,还有data,和前边的一样,data也可以在配置文件中配置:
<activity
android:name=".ThirdActivity"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="http"/>
//指定数据的协议必须是http协议。
</intent-filter>
</activity>
在标签中在配置一个标签,用于更精确地指定当前活动能够响应什么类型的数据
*只有标签中指定的内容和Intent中携带的Data完全一致时,当前活动才能够响应该Intent
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
//1. 首先指定了Intent的action是`Intent.ACTION_DIAL`,这又是一个Android系统的内置动作
//2. 然后在data部分指定了协议是tel,号码是10086
Intent(Context packageContext, Class >cls)
这个构造函数接收两个参数,第一个参数Context要求提供一个启动活动的上下文(
当前活动.this
),第二个参数Class则是指定想要启动的目标活动(目标活动.class
),通过这个构造函数就可以构建出Intent的“意图”
这种意图非常明显的Intent启动方式,称为显式Intent
Intent(String)
第二个Intent构造函数,将action中的字符串传进去。
每个Intent中只能指定一个action,但却能指定多个category。
intent.addCategory("com.example.activitytest.MY_CATEGORY");
添加一个category
然后运行,崩了
因为我们新增的category在标签中没有声明可以响应这个category*,所以会出现 ”没有活动可以相应这个Intent“ 的情况,我们在Manifest声明刚刚add的category即可。
在Intent的数据项中,我们可以找到“Extras”,它是Intent的数据载体,数据以键值对的方式传入,在活动中,我们经常需要通过Intent传入上一个活动运行过后的结果或接收到的数据来进行下一步的操作:
Intent中提供了一系列putExtra()方法的重载,可以把我们想要传递的数据暂存在Intent中,启动了另一个活动后,只需要把这些数据再从Intent中取出就可以了。
比如说FirstActivity中有一个字符串,现在想把这个字符串传递到Second-Activity中
/**将数据传入Intent*/
String data = "Hello SecondActivity";
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
//显式启动活动2
intent.putExtra("extra_data", data);
startActivity(intent);
putExtra(String , ...)
第一个参数是键,用于后面从Intent取值,第二个是真正传递的数据。/**将数据从Intent拿出来*/
Intent intent = getIntent();
//截取传入的Intent
String data = intent.getStringExtra("extra_data");
//getStringExtra()得到括号内键所对应的值
Log.d("SecondActivity", data);
getIntent()
方法获取到用于启动SecondActivity的IntentgetStringExtra()
方法,传入相应的键值,就可以得到传递的数据了getStringExtra()
方法来获取传递的数据。如果传递的是整型数据,则使用getIntExtra()
方法;如果传递的是布尔型数据,则使用getBooleanExtra()
方法在启动活动时,我们可以构造一个方法,以便我们取出并使用Intent传入的数据:
public static void actionStart(Context context, String data1, String data2){
Intent intent = new Intent(context, SecondActivity.class);
intent.putExtra("param1", data1);
intent.putExtra("param2", data2);
context.startActivity(intent);
}
在启动时,只需:
SecondActivity.actionStart(FirstActivity.this, "data1", "data2");
PendingIntent其实就是用来指定在某个操作之后,下一步做什么。有点Intent那味,所以是“pending 的 Intent”,我仅仅学到了用在通知的用法,用于点击通知后执行指定操作。
如要获取PendingIntent的实例:
PendingIntent.
getActivity(Context, int, Intent, int)
/getActivities(Context, int, Intent, int)
/
getBroadcast(Context, int, Intent, int)
/getService(Context, int, Intent, int)
;第一个参数依旧是
Context
第二个参数一般用不到,通常都是传入0即可。
第三个参数是一个Intent对象,我们可以通过这个对象构建出PendingIntent的“意图”
第四个参数用于确定PendingIntent的行为,
通常情况下这个参数传入0就可以了。//在当前版本,必须传入所提供的常量而非数字。
如果您一次只需要一个待定意图处于活动状态,则任何 您将使用的意图,然后您可以选择使用标志或 取消或修改与 您提供的意图。
FLAG_CANCEL_CURRENT
、FLAG_UPDATE_CURRENT
另请注意,标志喜欢或描述 挂起的意图实例,因此,用于标识它。检索或修改 使用这些标志创建的待处理意图也将要求在 与他人联合。例如,检索使用 创建的现有待处理意图FLAG_ONE_SHOT
,需要提供FLAG_ONE_SHOT
和FLAG_NO_CREATE
//以上内容源自谷歌文档 PendingIntent