使用Intent在活动间传递数据

Intent 除了可以用来启动一个活动,还可以在启动活动的时候传递数据。

向下一个活动传递数据

在启动活动时传递数据的思路很简单,Intent中提供了一系列 putExtra() 方法的重载,可以把我们想要传递的数据暂存在 Intent 中,启动了另一个活动后,只需要把这些数据再从Intent 中取出就可以了。

比如说 MainActivity 中有一个字符串,现在想把这个字符串传递到 SecondActivity 中,你就可以这样编写:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        String data = "Hi weber.pub";
        Intent intent = new Intent(MainActivity.this,SecondActivity.class);
        intent.putExtra("extra_data",data);
        startActivity(intent);
    }
});

使用显式 Intent 的方式来启动 SecondActivity,并通过 putExtra() 方法传递了一个字符串。注意这里 putExtra() 方法接收两个参数,第一个参数是键,用于后面从 Intent 中取值,第二个参数才是真正要传递的数据。

然后我们在 SecondActivity 中将传递的数据取出,并打印出来,代码如下所示:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_second);

    Intent intent = getIntent();
    String data = intent.getStringExtra("extra_data");
    Log.d("第二个活动:",data);

}

首先可以通过 getIntent() 方法获取到用于启动 SecondActivity 的 Intent,然后调用 getStringExtra() 方法,传入相应的键值,就可以得到传递的数据了。这里由于我们传递的是字符串,所以使用 getStringExtra() 方法来获取传递的数据,如果传递的是整型数据,则使用 getIntExtra() 方法,传递的是布尔型数据,则使用 getBooleanExtra() 方法,以此类推。

运行程序,我们在 SecondActivity 中成功得到了从 MainActivity 传递过来的数据。

返回数据给上一个活动

Activity 中有一个 startActivityForResult() 方法也是用于启动活动的,但这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。startActivityForResult() 方法接收两个参数,第一个参数还是 Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源。

修改 MainActivity 中按钮的点击事件,代码如下所示:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        Intent intent = new Intent(MainActivity.this,SecondActivity.class);
        startActivityForResult(intent,1);
    }
});

这里我们使用了 startActivityForResult() 方法来启动 SecondActivity,请求码只要是一个唯一值就可以了,这里传入了 1。接下来我们在 SecondActivity 中给按钮注册点击事件,并在点击事件中添加返回数据的逻辑,代码如下所示:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_second);

    Intent intent = getIntent();
    String data = intent.getStringExtra("extra_data");
    Log.d("第二个活动:",data);

    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("data_return","Hello weber.pub MainActivity ");
            setResult(RESULT_OK,intent);
            finish();
        }
    });

}

调用了 setResult() 方法。这个方法非常重要,是专门用于向上一个活动返回数据的。setResult() 方法接收两个参数,第一个参数用于向上一个活动返回处理结果,一般只使用 RESULT_OKRESULT_CANCELED 这两个值,第二个参数则是把带有数据的 Intent 传递回去,然后调用了 finish() 方法来销毁当前活动。

由于我们是使用 startActivityForResult() 方法来启动 SecondActivity 的,在 SecondActivity被销毁之后会回调上一个活动的 onActivityResult() 方法,因此我们需要在 FirstActivity 中重写这个方法来得到返回的数据,如下所示:

@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data){
    switch (requestCode){
        case 1:
            if (resultCode == RESULT_OK){
                String returnedData = data.getStringExtra("data_return");
                Log.d("MainActivity 接收返回结果:",returnedData);
            }
            break;
        default:
    }
}

onActivityResult() 方法带有三个参数,第一个参数 requestCode,即我们在启动活动时传入的请求码。第二个参数 resultCode,即我们在返回数据时传入的处理结果。第三个参数 data,即携带着返回数据的 Intent。

重新运行程序

如果用户在 SecondActivity 中并不是通过点击按钮,而是通过按下Back 键回到 FirstActivity,这样数据不就没法返回了吗?没错,不过这种情况还是很好处理的,我们可以通过重写 onBackPressed()方法来解决这个问题,代码如下所示:

@Override
public void onBackPressed() {
    Intent intent = new Intent();
    intent.putExtra("data_return", "返回按钮按下");
    setResult(RESULT_OK, intent);
    finish();
}

这样的话,当用户按下 Back 键,就会去执行 onBackPressed() 方法中的代码,我们在这里添加返回数据的逻辑就行了。

by web开发者 from http://weber.pub/

本文地址: http://weber.pub/安卓笔记7-使用intent在活动间传递数据/295.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值