Intent不仅是可以简单的启动活动,其实Intent还可以在启动活动的时候传递数据,
一:使用Intent向下一个活动传递数据。
Intent提供里一系列putExtra()方法的重载,这个方法可以把我们想要传递的数据,暂存在Intent中,启动另外一个活动之后,只需要把这些数据从再从Intent中去出来即可。ex:在一个活动中定义一个字符串(本人使用的活动是FirstActivity)现在现在想把这个字符串传递到SecondActivity活动中去:在FirstActivity活动中书写如下代码:
button1.setOnClickListener(new View.onClickListener(){
@Override
public void onClick( View v){
String date = "Hello SecondActivity";
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("extra_date",date);
startActivity(intent);
}
});
在这里我们还是使用一个显式的Intent来启动活动,并通过putExtra()方法传递了一个字符串,这里的putExtra()方法接受二个参数,第一个是键,用于后面从Intent中取值,第二个参数才是真正要传递的数据,
然后我们在SecondActivity中将数据取出来 并且打印,代码如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
Intent intent = getIntent();
String date = intent.getStringExtra("extra_date");
Log.d("SecondActivity",date);}
}
首先我们通过,getIntent()方法活动用于启动SecondActivity的Intent,然后调用getStringExtra()方法,传入相应的键值,这样就可以得到传递的数据了,此外值得提醒的是,如果传递是String类型的值,就用getStringExtra()方法来获得传递的数据,如果是整型则用getIntExtra()方法,是什么类型就用对应的方法。
重新运行程序,查看日志信息,就可以看到传递的数据。
二:返回数据给上一个活动。
之前有提到过返回上一个活动,按下Back键即可,其实Activity类中有一个startActivityForResult()方法也是用来启动活动的,但是这个方法期望在活动销毁的时候能够返回一个结果给上一个活动,startActivityForResult()方法还是接收二个参数,第一个参数还是Intent,第二个参数是请求码,用于在回调中判断数据来源,修改FirstActivity中的按钮点击事件实战代码如下:
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivityForResult(intent,1);
}
});
在这里我们用startActivityForResult()方法来启动SecondActivity活动,请求码只要是一个唯一值就好,然后我们在SecondActivity中给按钮注册事件,并且点击事件中添加数据返回逻辑,代码如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
Button button2 = (Button)findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("date_return","Hello FirstActivity");
setResult(RESULT_OK,intent);
finish();
}
});
}
}
阅读代码,我们可以知道,这里我们还是构建了一个Intent,只是它只是用来传递数据而已,然后把数据存放在Intet中,然后调用setResult()方法,这个方法专门向上一个活动返回数据,setResult()方法接受二个参数,第一个参数用于向上一个活动返回处理结果,一般调用RESULT_OK或RESULT_CANCELED这二个值,第二个参数则把带有数据的Intent传递回去,然后调用finish()来销毁当前活动,
由于我们是使用startActivityForResult()方法来启动SecondActivity的,在SecondActivity被销毁之前会回调上一个活动的onActivityResult()方法,因此我们需要在FirstActivity中重写这个方法来活动返回数据,代码如下:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case 1:
if(requestCode == RESULT_OK){
String returnedDate = data.getStringExtra("date_return");
Log.d("FirstActivity",returnedDate);
}
break;
default:
}
}
onActivityResult()方法带有三个参数,第一个requestCode,即在我们启动活动时候传入的请求码。第二个参数是resultCode,即我们在返回数据时传入的处理结果,第三个参数,date即携带者返回数据的Intent,因为在一个活动中可能调用startActivityForResult()方法去启动多个活动,并且每一个活动返回的数据都会回调onActivityResult()这个方法中,因此我们需要添加判断,判断数据来源,判断处理结果是否成功。重新运行程序查看日志信息;