向下一个活动发送数据
思路:将我们想要传递的数据暂时存储于Intent中,然后启动另一个活动之后,再从Intent中取出就好
例子:在FirstActivity中有一个Button,点击它会进入SecondAcitivity,并把一个字符串传递过去
Step 1:将数据存入Intent
button1.setOnClickListener (new OnClickListener () {
@Override
public void onClick (View v) {
String data = "this is the data that needed to be conveyed" ;
Intent intent = new Intent (FirstActivity.this , SecondActivity.class) ;
intent.putExtra ("extra_data" , data) ;
startActivity (intent) ;
}
}) ;
在这里,我们通过这一行代码,将要传递的数据存入了Intent
intent.putExtra ("extra_data" , data) ;
我们这里调用了putExtra( )方法,参数如下:
- 第一个参数是键,用处是可以在接收数据的活动中通过键来查找得到数据
- 第二个参数是一个字符串,即真正要传递的内容
Step 2:在被启动的活动中接收数据
在SecondActivity中接收数据,并用Log.d( )方法打印出来
protected void onCreate (Bundle savedInstanceState) {
……
Intent intent = getIntent() ;
String data = intent.getStringExtra ("extra_data") ;
Log.d ("SecondActivity" , data) ;
}
首先,我们通过getIntent ( )方法获取到用于启动SecondActivity的Intent对象
Intent intent = getIntent () ;
然后调用它的getStringExtra( )方法,传入相应的键值,就可以获取到得到的数据了
String data = intent.getStringExtra ("extra_data") ;
返回数据给上一个活动
和向下一个活动传递数据不同,返回上一个活动时候只需要按下Back键,并没有Intent对象可以用来传递数据
这时候,需要使用startActivityForResult( )方法来启动下一个活动而不是startActivity( )。这个方法期望在活动销毁时候可以返回一个结果给上一个活动
Step 1:在FirstActivity中使用startActivity( )来启动SecondActivity
我们修改FirstActivity.java中的代码
button1.setOnClickListener (new OnClickListener () {
@Override
public void onClick (View v) {
Intent intent = new Intent (FirstActivity.this , SecondActivity.class) ;
int requestCode = 1 ;
startActivityForResult (intent , requestCode) ;
}
}) ;
startActivityForResult ( )方法有两个参数:
- 第一个参数是Intent,还是一样
- 第二个参数是请求码,用于之后回调FirstActivity中的函数时候可以判断数据来源;回调这一步在Step 3中。请求码可以是任何值,只要唯一就好
Step 2:在SecondActivity中返回数据
在SecondActiivity中添加一个Button,点击它会销毁当前活动并返回数据给上一个活动
protected void onCreate (Bundle savedInstanceState) {
……
Button button2 = (Button) findViewById (R.id.button_2) ;
button2.setOnClickListener (new OnClickListener () {
@Override
public void onClick (View v) {
Intent intent = new Intent () ;
intent.putExtra ("data_return" , "this is the data returned") ;
setResult (RESULT_OK , intent) ;
finish () ;
}
}) ;
}
首先,我们构建了一个Intent对象,但是这个Intent对象仅仅只是用于传递数据,所以没有指定其他意图
Intent intent = new Intent () ;
然后,我们把要传递的数据放入Intent中,还是和之前一样
intent.putExtra ("data_return" , "this is the data returned") ;
紧接着,我们调用了setResult( )方法,这个方法专门用于向上一个活动返回数据
setResult (RESULT_OK , intent) ;
setResult( )方法接收两个参数:
- 第一个参数用于向上一个活动返回处理结果,一般只使用以下两个值:
- RESULT_OK
- RESULT_CANCELED
- 第二个参数则是传入了带有数据的intent
最后,我们使用finish( )来结束当前活动
finish () ;
Step 3:在SecondActivity被销毁后,因为是使用startActivityForResult( )方法启动的缘故,所以会回调FirstActivity中的onActivityResult( )方法。所以这里我们要重写FirstActivity中的onActivity( )方法
@Override
protected void onActivityResult (int requestCode , int resultCode , Intent data_intent) {
switch (requestCode) {
case 1 :
if (resultCode == RESULT_OK) {
String returnedData = data_intent.getStringExtra ("data_return") ;
Log.d ("FirstActivity" , returnedData) ;
}
break ;
default :
break ;
}
}
onActivityResult( )方法带有三个参数:
- 第一个参数requestCode,就是在启动活动时候,Step 1中给startActivityForResult( )传入的第二个参数—requestCode
- 第二个参数resultCode,就是在SecondActivity中调用setResult( )方法时候的第一个参数,即处理结果
- 第三个则是带有数据的Intent对象
首先,通过requestCode来判断数据来源
switch (requestCode) {
case 1 :
……
break ;
……
}
然后在相应的case下面,判断数据处理结果
if (resultCode == RESULT_OK) {
……
}
最后,在相应的if语句判断中,获取返回的数据,并执行自定义逻辑。同样是通过键值来找打数据
String returnedData = data_intent.getStringExtra ("data_return") ;
……
但是,以上代码可以实现通过在SecondActivity中点击Button来实现数据的返回,如果使用者更喜欢按下返回键呢?这个问题我们可以通过重写SecondActivity中的onBackPressed( )方法来解决
修改Step 2的代码:
@Override
public void onBackPressed () {
Intent intent = new Intent () ;
intent.putExtra ("data_return" , "this is the data returned") ;
setResult (RESULT_OK , intent) ;
finish () ;
}
这样,当用户在SecondActivity中按下Back键时候,就会执行里面的代码