利用intent向下一个活动传递数据

发布于 2019-04-15  339 次阅读


向下一个活动传递数据

在刚刚开始学习android的开发之后,遇到的第一个难题就是intent,因为它承担了我一开始用来启动另外一个活动的入口,但是它也能用来给下一个活动传递一些数据。

  1. 利用putExtra(String name,类型 value)这个方法,传递简单数据
    (putExtra有很多种重载的方法,这里就不再一一赘述)
    第一个参数就是所谓的键,简单来说就是所谓的用于识别传递数据的名字
    第二个参数主要是要传递的数据(可以使用int,string,doube等各种方法

首先在你需要传值的活动下写上

button1.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v){
        String data = "Hello next";
        Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
        intent.putExtra("extra_data",data);
        //这里我们设置这个键为extra_data,并且传入值data;
        startActivity(intent);
    }

});

然后在启动的活动中取出所对应的值

protected void onCreate(Bundle saveInstanceState){
    super.onCreate(saveInstanceState);
    setContentView(R.layout.second_layout);
    Intent intent = getIntent();
    //首先用getIntent()这个方法获取到用于启动当前活动的Intent
    String data = intent.getStringExtra("extra_data");
    //然后运用getStringExtra()方法获取传递过来的值,需要注意传过来的是什么类型,比如int就用getIntExtra()
    Log.d("SecondActivity",data);
}

然后你就能在Logcat中发现刚刚传递过来的值了

  1. 传递数据包
    主要采用Bundle()方法中存储数据包的方法。
putString(String name,String value); //存储字符串在Bundle包中
putInt(String name,int value); //存储整型数据在Bundle包中
//其他还有很多的类型,自己看

然后运用putExtras();
到这里为止和上面的方法还是很相识的

过程参考一下别人写的博客,大概如下:
将一系列的数据(包括字符串、整型、布尔型等等)整合在Bundle包中(利用putString()、putInt()等方法),用Intent中的putExtras()或者putExtra()方法传递给其他活动。

 intent = new Intent(MainActivity.this,two_activity.class);
    Bundle bundle = new Bundle();
    //创建一个新的Bundle包
    bundle.putString("name",data);
    //运用putString()方法,这里和上面差不多
    bundle.putInt("number",01);
    //运用putInt传值,键为“age”
    intent.putExtras(bundle);
    //传递
    startActivity(intent);
    break;

然后再取出来

 Intent intent = getIntent();
        Bundle bundle = intent.getExtras();
        no_laypt.setText(String.format("name:%s     nember:%d",bundle.getString("name"),bundle.getInt("number") ));

返回数据给上一个活动

既然可以传过去,那么当然可以传回来
这里就介绍一个新方法:startActivityForResult(Intent intent,int requestCode);
这个方法和startActivity()是一样的,也是用于启动活动,但是这个方法期望在活动销毁的时候能够放回一个结果给上一个活动;
方法第一个还是Intent,第二个则是请求码。用于之后的回调中判断数据的来源

比如我们的button_1是用来加载下一个活动的

button_1.setOnClickListener(new View.OnClickListener(){
    @Override
        public void onClick(View v){
        Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
        StartActivityForResult(intent,1);
        //这里请求码我们传入1
    }
});

有启动的方法,那么应该也有一个相对于放回的方法。
放回则使用setResult(int resultCode,Intent data);
这个方法是专门向上一个活动放回处理结果的,一般参数1只使用RESULT_OK或RESULT_CANCELED这两个值; 参数2则把带有数据的Intent传递回去。
我们修改SecondActivity的button_2,让它来回调FirstActivity

button_2.setOnClickListener(new View.OnClickListener(){
    @Override
        public void onClick(View v){
        Intent intent = new Intent();
        intent.putExtra("data_return","Hello FirstActivity");
        //还是设置一个put来创建要传回的值
        setResult(RESULT_OK,intent);
        //用刚刚说的方法传出
        finish();
        //销毁当前活动
    }
})

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

 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:
                break;
        }
    }
!

现在SecondActivity就把值传回给了FirstActivity,但是如果用户不是点击按钮而是直接按返回键呢?
这个时候只要在SecondActivity中重写onBackPressed()这个方法就可以了

@Override
    public void onBackPressed(){
    Intent intent = new Intent();
    intent.putExtra("data_return","Hello FirstActivity");
    setResult(RESULT_OK,intent);
    finish();
}

一只蠢莫