Intent 是Android程序中各个组件之间进行交互的重要方式之一,它既可以在当前Activity中指定想要完成的动作,还可以在不同组件间进行数据传递。Intent可分为两种,显示Intent和隐式Intent。
1.显示Intent
首先介绍显示Intent的用法,通过其中一个Intent的构造方法Intent(Context pageContext,Class> cls)如下构造方法实例化一个显示Intent,这个构造函数接收两个参数,第一个参数Context需要填入一个启动活动的上下文,一般为当前Activity,第二个参数Class是指定要启动的目标活动,通过这个构造函数就可以构造出代表我们”意图”的Intent对象。
修改FirstActivity中按钮的点击事件,代码如下:
1 |
mybutton.setOnClickListener(new OnClickListener() { |
3 |
public void onClick(View v) { |
4 |
Intent intent = new Intent(FirstActivity.this,SecondActivity.class); |
5 |
startActivity (intent); |
在上面例子中,我们首先构造了一个Intent(显示Intent),传入FirstActivity.this作为上下文,SecondActivity.class作为目标活动,这样我们就明确了我们的意图,即在FirstActivity这个活动中通过点击mybutton按钮打开SecondActivity这个活动。然后通过Activity类的startActivity()方法来执行该意图操作。startActivity()方法是Activity类中提供的,专门用于启动活动的方法,它接收一个Intent对象。在上例中我们将构建好的意图对象传入该方法就可以启动目标活动。
2.隐式Intent
与显式Intent相比隐式Intent是一种比较含蓄的Intent。它不指定要启动哪个活动,而是通过配置一些相关信息如:action,category等信息,然后交给系统去分析并找出合适的活动去启动。
Action:用来指明要实施的动作是什么,比如说ACTION_VIEW, ACTION_EDIT等。具体的可以查阅android SDK-> reference中的Android.content.intent类,里面的constants中定义了所有的action。
一些常用的Action:
ACTION_CALL 启动一个电话.
ACTION_EDIT 显示用户编辑的数据.
ACTION_MAIN 作为Task中第一个Activity启动
ACTION_SYNC 同步手机与数据服务器上的数据.
ACTION_BATTERY_LOW 电池电量过低警告.
ACTION_HEADSET_PLUG 插拔耳机警告
ACTION_SCREEN_ON 屏幕变亮警告.
ACTION_TIMEZONE_CHANGED 改变时区警告.
Category:一个字符串,包含了关于处理该intent的组件的种类的信息。一个intent对象可以有任意个category。intent类定义了许多category常数.
addCategory()方法为一个intent对象增加一个category,
removeCategory删除一个category,
getCategories()获取intent所有的category.
修改FirstActivity中的按钮点击事件,
1 |
mybutton.setOnClickListener(new OnClickListener() { |
3 |
public void onClick(View v) { |
4 |
Intent intent = new Intent("android.intent.action.ALL_APPS"); |
5 |
intent.addCategory("com.example.intent_test.MY_CATEGORY"); |
6 |
startActivity (intent); |
在上面例子中,我们首先初始化了一个Intent对象,并指定action参数。其次调用Intent中的addCategory()方法来添加一个category。每个Intent中只能指定一个action,但却能指定多个category。
为了能使SecondActivity能继续响应该Intent,我们可以在AndroidManifest.xml文件下的标签下配置的内容,来指定当前活动能够响应的action和category。
3.通过Intent向下一个活动传递数据
通过Intent对象在启动活动时传递数据很简单,执行在当前活动中调用PutExtra()方法把要传递的数据暂存在Intent中,并在新启动的Activity中取出Intent中的数据即可。比如我们可以把FristActivity中的一个字符串传递到SecondActivity中,就可以如下方式实现:
1 |
mybutton.setOnClickListener(new OnClickListener() { |
3 |
public void onClick(View v) { |
4 |
String data = "I com from FirstActivity"; |
5 |
Intent intent = new Intent(FirstActivity.this,SecondActivity.class); |
6 |
intent.putExtra("extra_data",data); |
在上面例子中,我们使用显示Intent的方式来启动SecondActivity,并通过putExtra()方法传递一个字符串到SecondActivity。这里putExtra()方法
接收两个参数,第一个是键,第二个是值,代表真正要传递的数据。
接下来我们在SecondActivity中将Intent对象中的数据取出,并进行其他操作,代码如下:
1 |
public class SecondActivity extends Activity { |
3 |
protected void onCreate(Bundle savedInstanceState) { |
4 |
super.onCreate(savedInstanceState); |
5 |
setContentView(R.layout.activity_second); |
6 |
Intent intent = getIntent(); |
7 |
String data = intent.getStringExtra("data"); |
8 |
Toast.makeText(SecondActivity.this, data, Toast.LENGTH_LONG).show(); |
在上面代码中首先通过调用getInstent()方法获取用于启动SecondActivit的Intent,然后调用Intent对象的getStringExtra()方法,传入相应的键名,就可以得到传来的数据。
4.通过Instent对象返回数据给上一个活动
在上面内容中我们介绍了如何通过Intent对象将数据传递给下一个活动。那么这里我们探讨一下如何将数据返回给上一个活动。要将数据返回给上一个活动我们可以调用一个startActivityForResult()方法,该方法也是用来启动活动的,但是这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。startActivityForResult()方法接收两个参数,第一个还是Intent,第二个是请求码用于判断回调的来源,请求吗必须唯一。用法如下:
2 |
mybutton.setOnClickListener(new OnClickListener() {
|
4 |
public void onClick(View v) { |
5 |
Intent intent = new Intent(FirstActivity.this,SecondActivity.class); |
6 |
startActivityForResult(intent,1 ); |
这里我们使用startActivityForResult(intent,1 );来启动SecondActivity,接下来在SecondActivity中给按钮mybutton2注册点击事件,并在按钮
点击事件中添加返回数据的逻辑,代码如下:
2 |
mybutton2.setOnClickListener(new OnClickListener() {
|
4 |
public void onClick(View v) { |
5 |
Intent intent = new Intent(); |
6 |
intent.putExtra("return_date","I com from SecondActivity"); |
7 |
setResult(RESULT_OK,instent); |
我们首先实例化一个Intent对象,并把要传递的数据封装在该对象中,然后调用setResult()方法。该方法专门用于向上一个活动返回数据,接收两个参数,第
一个参数用于向上一个活动返回处理结果,第二个参数则是把带有数据的Intent传递回去。
由于我们使用startActivityForResult()方法来启动SecondActivity的,在SecondActivity被销毁之后会回调上一个活动的onActivityResult()方法
,因此我们要在FirstActivity中重写该方法来得到数据,如下:
2 |
protected void onActivityResult(int requestCode, int resultCode, Intent data) { |
3 |
// TODO Auto-generated method stub |
4 |
super.onActivityResult(requestCode, resultCode, data); |
7 |
if (resultCode == RESULT_OK) { |
8 |
String returnData = data.getStringExtra("data_result"); |
9 |
Toast.makeText(this, returnData, Toast.LENGTH_LONG).show(); |
上例中的onActivityResult()方法有三个参数,第一个requestCode,就是我们在启动活动时传入的请求码,
用来判断消息来源。第二个参数resultCode就是我们在返回数据时传入的处理结果,用来判断处理结果是否成功,
第三个代表携带返回数据的Intent。