Intent是android程序中各组件之间进行交互的一种重要方式,既可以在不同组件之间传递数据,还能指明当前组件想要执行的动作。
Intent可被用于启动活动、启动服务、以及发送广播等。大致分为两种使用方式:显示Intent和隐式Intent。这里主要讲启动活动。
1.显示Intent
(1)跳转到下个活动
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
直接在代码中new一个Intent即可,其中第一个值是context,一般是当前活动.this即可,第二个值是Class类型的,一般传入目标活动.class即可。
然后通过调用startActivity()方法即可实现跳转。
(2)携带数据跳转到下个活动
可以这样传值:
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("name","Li");
startActivity(intent);
可以使用Intent的putExtra()方法携带值并传递给目标活动,其中putExtra()方法的第一个参数是键,第二个参数是要传递的值。
在第二个活动中如何去到传递的值呢?
Intent intent = getIntent();
String s = intent.getStringExtra("name");
可以通过getIntent()方法得到Intent对象,然后调用他的get....方法去取得传递的值,由于刚才传递的值是String类型的,所以这里调用getStringExtra()方法,其中需要传递的参数是传递值的键名,在这里也就是"name"。
(3)返回数据给上个活动
有时候我们可能需要在返回上个活动的时候传递一些数据回去,这该怎么做呢?
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivityForResult(intent,1);
可以看到,在跳转时我们不再使用startActivity()方法,而是使用startActivityForResult()方法,其中第一个参数是一个Intent对象,表明意图,第二个参数是请求码,唯一即可,下面会讲到。
在第二个活动中回传需要传递的数据:
Intent intent = new Intent();
intent.putExtra("age",18);
setResult(RESULT_OK,intent);
可以看到我们先new了一个空的Intent对象,这个对象只是为了传递数据,调用putExtra()方法传入键值,接下来调用了setResult()方法,这个方法接收两个参数,第一个是结果码,用于向上一个活动返回处理结果,第二个参数就是一个带有数据Intent。
在返回上个活动后如何得到返回值呢?
需要在第一个活动中重写onActivityResult(int requestCode, int resultCode, Intent data)方法,这个方法有三个参数,第一个是请求码,也就是我们在第一个活动设置的1,第二个是结果码,在第二个活动中设置的RESULT_OK(这是自带的一个常量,还有个为RESULT_CANCELED),都可以使用,也可以自己写,唯一即可,第三个参数就是返回的带数据的intent了,只有当前两个参数等于我们设置的值时,intent才是我们需要的:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode==1&&resultCode==RESULT_OK){
int age = data.getIntExtra("age",-1);
}
}
这里的getExtra()传入两个参数,第一个是键名,第二个是如果没有取到的默认返回值。
2.隐式Intent
隐式Intent在需要跳转时并不明确的指出要启动哪个活动,而是在跳转的活动中配置了action和category属性,然后由系统判定应该打开哪个活动,一个活动只能有一个action但是却可以有很多个category。
在AndroidManifest.xml我们对第二个活动(也就是要跳往的活动)进行如下配置:
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START"/>
<category android:name="com.example.activitytest.MY_CATEGORY"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
可以看到我们配置了action和category两个标签,后面的name是自定义的,一般我们用包名.自定义名即可。至于第三个category是必须加上的,因为在跳转时候会默认添加这个category,否则将会报错。
那么在第一个活动中我们该如何实现跳转呢?
Intent intent = new Intent("com.example.activitytest.ACTION_START");
intent.addCategory("com.example.activitytest.MY_CATEGORY");
startActivity(intent);
我们可以看到在new intent()的时候我们传入了action的值,然后调用addCategory()加了一个category,只有当action和category都匹配时才会跳转,由于在这里系统会默认增加一个名为android.intent.category.DEFAULT的category,因此在上边我们才必须加一个category。当没有可响应的活动时,就会报错: