Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想哟啊执行的动作,还可以在不同组件之间传递数据。Intent一般可被用于启动活动、启动服务、以及发送广播等。
Intent用法大致分为两种,显式Intent和隐式Intent。
一、显式Intent
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
}
});
首先要构造出一个Intent对象,传入FirstActivity.this作为上下文,传入SecondActivity.class作为目标活动,我们的意图就是在FirstActivity活动的基础上启动SecondActivity目标活动,然后通过startActivity()方法来执行这个Intent。
二、隐式Intent
隐式Intent并不指明我们想要启动哪一个活动,而是指定了一系列更为抽象的action和category等信息,然后交由系统分析找出可以响应这个隐式Intent的活动。
首先在AndroidManifest中的<activity>标签中配置<intent-filter>的内容,
<span > </span><activity
android:name="com.gomez.menutest.SecondActivity">
<intent-filter>
<action android:name="com.gomez.menutest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
在<action>标签中指明com.gomez.menutest.ACTION_START这个action,而<category>标签则包含了一些附加信息,更精确地指明了当前的活动能够响应的Intent中还可能带有的category。只有
<action>和<category>中的内容同时能够匹配上Intent中的action和category时,这个活动才能响应该Intent。修改按钮点击事件:
@Override
public void onClick(View v) {
intent = new Intent(FirstActivity.this, SecondActivity.class);
// startActivity(intent);
Intent intent = new Intent("com.gomez.menutest.ACTION_START");
startActivity(intent);
}
在这里没有指定category,因为android.intent.category.DEFAULT是一种默认的category,在调用startActivity()方法的时候会自动将这个category添加到Intent中。每个Intent只能指定一action,但可以指定多个category。现在我们再来增加一个category
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
// startActivity(intent);
Intent intent = new Intent("com.gomez.menutest.ACTION_START");
intent.addCategory("com.gomez.menutest.MY_CATEGORY");
startActivity(intent);
}
接下来修改
AndroidM
anifest中<activity>标签
<span > </span><activity
android:name="com.gomez.menutest.SecondActivity">
<intent-filter>
<action android:name="com.gomez.menutest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.gomez.menutest.MY_CATEGORY" />
</intent-filter>
</activity>
这样SecondActivity就可以响应这个category。
三、活动间的数据传递
1、向下一个活动传递数据
在启动活动是传递数据的私立很简单,Intent提供一系列putExtra()方法重载,可以把我们想要传递的数据暂存在Intent中,启动另一个活动后,只需把这些数据再从Intent中区取出即可。比如传递一个字符串,可以这样编写代码:
<pre name="code" class="java">public void onClick(View v) {
String data = "Hello secondActivity";
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("extra_data", data);
startActivity(intent);
}
注意这里的putExtra()方法接收两个参数,第一个参数是键,第二参数是要传递的数据。
然后我们在SecondActivity中将传递的数据取出,并打印出来
public class SecondActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity", data);
}
}
2、返回数据给上一个活动
修改点击事件代码:
public void onClick(View v) {
String data = "Hello secondActivity";
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent, 1);
}
这里我们使用startActivityForResult()方法来启动SecondActivity,第一个参数是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源,这里我们传入1就可以了。
接下来我们在SecondActivity中注册按钮事件
button2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("data_return", "Hello FirstActivity");
setResult(RESULT_OK, intent);
finish();
}
});
注意这里的调用的setResult()方法,是专门用于向上一个活动返回数据的,第一个参数用于向上一个返回处理的结果,一般是只使用RESULT_OK或
RESULT_CANCELED这两个值,第二个参数是带有数据的Intent对象。然后调用finish(),销毁当前活动,当返回上一个活动时,会回调onActivityResult()方法,因此我们要在FirstActivity中重写这个方法来得到返回的数据。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1:
if(resultCode == RESULT_OK){
String returnData = data.getStringExtra("data_return");
Log.d("FirstActivity", returnData);
}
break;
default:
break;
}
}
第一个参数是在启动活动时的请求码,第二个参数是返回数据时传入的处理结果,第三个参数是携带返回数据的Intent。
如果我们通过back键返回上一个活动我们可以通过重写onBackPressed()方法来解决,代码如下:
@Override
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra("data_return", "Hello FirstActivity");
setResult(RESULT_OK, intent);
finish();
}