使用Intent在启动活动时候来传递数据

向下一个活动发送数据

思路:将我们想要传递的数据暂时存储于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( )方法,参数如下:

  1. 第一个参数是键,用处是可以在接收数据的活动中通过键来查找得到数据
  2. 第二个参数是一个字符串,即真正要传递的内容
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 ( )方法有两个参数:

  1. 第一个参数是Intent,还是一样
  2. 第二个参数是请求码,用于之后回调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( )方法接收两个参数:

  1. 第一个参数用于向上一个活动返回处理结果,一般只使用以下两个值:
    1. RESULT_OK
    2. RESULT_CANCELED
  2. 第二个参数则是传入了带有数据的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( )方法带有三个参数:

  1. 第一个参数requestCode,就是在启动活动时候,Step 1中给startActivityForResult( )传入的第二个参数—requestCode
  2. 第二个参数resultCode,就是在SecondActivity中调用setResult( )方法时候的第一个参数,即处理结果
  3. 第三个则是带有数据的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键时候,就会执行里面的代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值