利用Intent进行数据传递

时间:2024-03-22 12:35:03

        前面两节讲到过Intent的使用,主要用来在活动之间起到一个桥梁的作用,但是无论显式Intent还是隐式Intent,目前我们只是用来启动活动,其实Intent还可以在启动活动的时候传递数据,本节我们就来学习一下。

        在启动活动的时候传递数据的思路很简单,Intent中提供了一系列putExtra()方法的重载,可以把我们想要传递的数据暂存在Intent中,启动了另一个活动之后,只需要把这些数据再从Intent中取出就可以了。比如说我们还用之前的例子,FirstActivity中有一个字符串,现在要把这个字符串传递到SecondActivity中,FirstActivity我们就可以这样写:


public class FirstActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);  //在活动中加载first_layout布局
        Button button1 = (Button) findViewById(R.id.button_1);
        button1.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                String data = "Hello SecondActivity";
                Intent intent = new Intent("com.example.activitytest1.ACTION_START");
                intent.addCategory("com.example.activitytest1.MY_CATEGORY");
                intent.putExtra("extra_data",data);
                startActivity(intent);
            }
        });
    }
}


其中,String data就是我们要传递的字符串,我们使用隐式Intent的方式来启动SecondActivity,然后通过putExtra()方法接收两个参数,第一个参数是键,用于后面从Intent中取值,第二个参数才是我们真正要传递的数据。接下来看一下在SecondActivity中如何取出传递过来的数据,代码如下:


public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout); //加载second_layout布局
        Intent intent = getIntent();
        String data = intent.getStringExtra("extra_data");
        Log.d("SecondActivity",data);
    }
}


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

好了,现在我们来运行一下程序,点击button1按钮,就会跳转到SecondActivity中,并且会传入相应的数据,如下图:


利用Intent进行数据传递


跳转的界面我就不放上来了,就是和之前的一样。这里我截了一段日志。我们在红框中可以看到,从FirstActivity中传递的字符串内容成功的传递到了SecondActivity中。那么,通过Intent向下一个活动传递数据就成功了。


接下来我们看一下,如何把数据返回给上一个活动。我们先来看FirstActivity中的代码:


@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.first_layout);  //在活动中加载first_layout布局
    Button button1 = (Button) findViewById(R.id.button_1);
    button1.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){
            Intent intent = new Intent("com.example.activitytest1.ACTION_START");
            intent.addCategory("com.example.activitytest1.MY_CATEGORY");
            startActivityForResult(intent,1);  //通过startActivityForResult()方法来启动下一个活动
        }
    });
}


在这里,我们使用startActivityForResult()来启动活动,其中,第一个参数是intent,第二个参数是请求码,用于在之后的回掉中判断数据的来源。因为这个方法会在活动销毁的时候能够返回一个结果给上一个活动。

再来看一下SecondActivity中的代码,如下:


利用Intent进行数据传递



红框中的代码,intent不是用来启动活动的,而是用来传递数据的,通过调用setResult()方法,其中这个方法有两个参数,第一个用于向上一个活动返回一个处理结果,第二个参数用于传递数据回去。因为我们是使用的startActivityForResult()方法来启动的活动,所以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("FirstActivity",returnedData);
            }
            break;
        default:
    }
}

这个方法中带有三个参数,其中第一个参数是requestCode,就是我们在请求活动时传入的请求码。第二个参数时resultCode,是我们在返回数据时传入的处理结果,第三个参数data,就是携带着返回数据的Intent。

由于在上一个活动中可能调用startActivityForResult()方法去启动很多不同的活动,每一个活动返回的数据都会回调到onActivityResult()这个方法中,因此我们要先通过requestCode这个请求码来判断数据的来源,也就是是否是从SecondActivity中返回的数据。再通过resultCode来判断处理结果是否成功,最后从data中获得数据。

我们运行程序,点击button2按钮,看下日志显示情况:


利用Intent进行数据传递



Hello FirstActivity,正是我们从SecondActivity返回给上一个活动的数据。说明我们通过Intent来向上一个活动以及下一个活动传递数据都成功了。

好了,关于通过Intent来传递数据,就学到这里。想必聪明的你一定已经完全掌握了。下一节,我们来学习一下活动的生命周期,非常非常重要的一个知识点。不要错过哦!利用Intent进行数据传递