Intent 是Android程序中各个组件之间进行交互的重要方式之一,它既可以在当前Activity中指定想要完成的动作,还可以在不同组件间进行数据传递。Intent可分为两种,显示Intent和隐式Intent。
1.显示Intent
首先介绍显示Intent的用法,通过其中一个Intent的构造方法Intent(Context pageContext,Class> cls)如下构造方法实例化一个显示Intent,这个构造函数接收两个参数,第一个参数Context需要填入一个启动活动的上下文,一般为当前Activity,第二个参数Class是指定要启动的目标活动,通过这个构造函数就可以构造出代表我们”意图”的Intent对象。
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivity (intent);
2.隐式Intent
Intent用于在一个组件(Component,如Activity、Service、Broadcast Receiver)中打开另一个组件。可分为隐式(implicitly)和显式(explicitly)两种:
Explicitly Intent:在知道要打开哪个具体的Component时使用,通过指定调用者和被调用者即可打开目标Component;
Implicitly Intent:在不确切的知道要打开哪个Component的情况下,通过指出action、data、category,系统会寻找到匹配的Component。
Explicitly Intent
当明确知道你想打开哪个Component时,它就是你的菜。通常这样使用:
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra("key", "value");
startActivity(intent);
执行以上代码会导致目标Component(这里是MainActivity)被创建(onCreate(...)等一系列生命周期方法被调用)。在MainAcitivity中的相应生命周期方法中通过getIntent.getXxxExtra(“key”)即可得到随Intent一起传过来的数据。
Implicitly Intent
Implicitly Intent很好的实现了调用者和被调用者之间的解耦:调用者通过action、data、category这三个方面描述他的Intent,被调用者通过在manifest文件中声明的一系列Intent Filter来描述自己能够响应哪些意图。如此一来,调用者和被调用者无需互相了解,通过Implicitly Intent这个联系他们的纽带就能很好的协同工作。
3.通过Intent向下一个活动传递数据
通过Intent对象在启动活动时传递数据很简单,执行在当前活动中调用PutExtra()方法把要传递的数据暂存在Intent中,并在新启动的Activity中取出Intent中的数据即可。
String data = "I com from FirstActivity";
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("extra_data",data);
startActivity(intent);
在上面例子中,我们使用显示Intent的方式来启动SecondActivity,并通过putExtra()方法传递一个字符串到SecondActivity。这里putExtra()方法
接收两个参数,第一个是键,第二个是值,代表真正要传递的数据。
接下来我们在SecondActivity中将Intent对象中的数据取出,并进行其他操作,代码如下:
Intent intent = getIntent();
String data = intent.getStringExtra("data");
在上面代码中首先通过调用getInstent()方法获取用于启动SecondActivit的Intent,然后调用Intent对象的getStringExtra()方法,传入相应的键名,就可以得到传来的数据。
4.通过Instent对象返回数据给上一个活动
在上面内容中我们介绍了如何通过Intent对象将数据传递给下一个活动。那么这里我们探讨一下如何将数据返回给上一个活动。要将数据返回给上一个活动我们可以调用一个startActivityForResult()方法,该方法也是用来启动活动的,但是这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。startActivityForResult()方法接收两个参数,第一个还是Intent,第二个是请求码用于判断回调的来源,请求吗必须唯一。用法如下:
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivityForResult(intent,1 );
这里我们使用startActivityForResult(intent,1 );来启动SecondActivity,接下来在SecondActivity中给按钮mybutton2注册点击事件,并在按钮
点击事件中添加返回数据的逻辑,代码如下:
Intent intent = new Intent();
intent.putExtra("return_date","I com from SecondActivity");
setResult(RESULT_OK,instent);
finish();
我们首先实例化一个Intent对象,并把要传递的数据封装在该对象中,然后调用setResult()方法。该方法专门用于向上一个活动返回数据,接收两个参数,第
一个参数用于向上一个活动返回处理结果,第二个参数则是把带有数据的Intent传递回去。
由于我们使用startActivityForResult()方法来启动SecondActivity的,在SecondActivity被销毁之后会回调上一个活动的onActivityResult()方法
,因此我们要在FirstActivity中重写该方法来得到数据,如下:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 1:
if (resultCode == RESULT_OK) {
String returnData = data.getStringExtra("data_result");
Toast.makeText(this, returnData, Toast.LENGTH_LONG).show();
}
break;
default:
break;
}
}