Activity之间数据传递

作者: wxyass 分类: Android 发布时间: 2016-08-08 11:46

目录

  1. 向下个Activity传递数据
  2. 返回数据给上一个Activity


1.1 向下一个Activity传递数据

有两种方式:

方式1
在FirstActivity中用Intent封装数据,在SecondActivity中解析Intent封装的数据.
代码: FirstActivity页面

Button button8 = (Button) findViewById(R.id.button8);
button8.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                // 使用Intent封装数据
                String data = "Hello SecondActivity";
                Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
                intent.putExtra("data",data);
                startActivity(intent);
            }
        });  

代码: SecondActivity页面

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        // 解析Intent封装的数据
        Intent intent = getIntent();
        String data = intent.getStringExtra("data");
        Toast.makeText(SecondActivity.this, data, Toast.LENGTH_SHORT).show();
    }
}  

方式2
使用bundle先封装好数据,再使用Intent传递数据.
代码: FirstActivity页面

Button button9 = (Button) findViewById(R.id.button9);
button9.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                // 使用Bundle封装数据,再把bundle封装至intent中
                String name = "测试123";
                String pwd = "测试456";

                Intent intent = new Intent(FirstActivity.this, SecondActivity.class);

                //把数据封装至bundle中
                Bundle bundle = new Bundle();
                bundle.putString("name", name);
                bundle.putString("pwd", pwd);

                //把bundle封装至intent中
                intent.putExtras(bundle);

                startActivity(intent);
            }
        });  

代码: SecondActivity页面

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        // 获取Intent
        Intent intent = getIntent();
        //先通过intent获取Bundle对象
        Bundle bundle = intent.getExtras();
        //再通过Bundle对象,获取数据
        String name = bundle.getString("name");
        String pwd = (String) bundle.get("pwd");
        Toast.makeText(SecondActivity.this, name+" & "+pwd, Toast.LENGTH_SHORT).show();
    }
}  

1.2 返回数据给上一个Activity

Activity中还有一个 startActivityForResult() 方法也是用于启动新Activity的,
这个方法期望在新Activity销毁时能够返回一个结果给上一个Activity,但这正是我们需要的.

  1. 在FirstActivity中用startActivityForResult启动新Activity
Button button10 = (Button) findViewById(R.id.button10);
button10.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                // startActivityForResult
                Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
                startActivityForResult(intent,1);
            }
        });  

startActivityForResult()方法接收2个参数,第一个参数还是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源.请求码只要是一个唯一值就可以了,这里传入了1.

  1. 在SecondActivity中封装要返回的数据,并销毁当前Activity.
public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Button button1 = (Button) findViewById(R.id.aty_s_button1);
        button1.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                Intent intent = new Intent();
                intent.putExtra("data","Hello FirstActivity");
                setResult(RESULT_OK,intent);
                finish();
            }
        });
    }
}  

setResult()方法非常重要,专门用于向上一个Activity返回数据的,setResult()接收两个参数,第一个参数用于向上一个Activity返回处理结果,一般只使用RESULT_OK或RESULT_CANCELED这两个值,第二个参数则把带有数据的Intent传递回去,然后调用了finish()方法来销毁当前Activity.
3. 页面回到FirstActivity,调用解析SecondActivity传递过来的数据

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode){
            case 1:
                if(resultCode == RESULT_OK){
                    String backData = data.getStringExtra("data");
                    Toast.makeText(FirstActivity.this, backData, Toast.LENGTH_SHORT).show();
                }
                break;
            default:
        }
    }  

onActivityResult()带3个参数,第一个参数requestCode,即我们在启动新Activity时传入的请求码,第二个参数resultCode,即我们在返回数据时传入的处理结果,第三个参数data,即携带者返回数据的Intent.

由于在一个Activity中可能调用startActivityForResult()方法去启动很多不同的新Activity,每一个Activity返回的数据都会回调到onActivityResult()方法,因此我们首先通过检查requestCode的值来判断数据来源,再通过resultCode的值来判断处理结果是否成功.最后从data中取值Toast出来,这样就完成向上一个Activity返回数据的工作.

源码下载: http://ojupj7fr2.bkt.clouddn.com/ActivityTest.rar

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注