前面我们了解了如何启动一个Activity,一个Activity在启动另外一个Activity的时候可能会遇到需要传值的需要。Activity之间传值是通过Bundle来实现的。
一、通过Bundle传值介绍
二、通过Bundle传值例子Intent提供了多个重载方法来携带数据
putExtras(Bundle data):向Intent中放入需要的数据包
Bundle getExtras():取出Intent所携带的数据
putExtras(String name, Xxx value):向Intent中按照key-value形式传值
getXxxExtra(String name):从Intent中按key取值
从上面方法中可以看到Bundle就像一个数据包一样,Bundle中存取数据的方法如下:
pubXxx(String key, Xxx data):向Bundle中放入数据
pubSerializable(String key, Serializable data):向Bundle中放入一个可序列化的对象。
getXxx(Strign key):从Bundle中取出数据
getSerializable(String key, Serializable data):从Bundle中取出一个可序列化的对象。
Bundle对象是由系统需要时自动创建的,我们不需要管。
三、通过Bundle返回结果MainActivity.java中的核心代码
Person.java类
- Intent intent = new Intent();
- intent.setAction("com.example.intent.action.TEST_ACTION");
- intent.putExtra("test1", 1);
- Bundle bundle = new Bundle();
- bundle.putBoolean("test2", false);
- bundle.putSerializable("test3", new Person("大碗干拌", 2));
- intent.putExtras(bundle);
- startActivity(intent);
SecondActivity.java
- package com.example.testintent;
- import java.io.Serializable;
- public class Person implements Serializable{
- private String name;
- private int age;
- public Person(String name, int age) {
- super();
- this.name = name;
- this.age = age;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- @Override
- public String toString() {
- // TODO Auto-generated method stub
- return "姓名:" + name +", " + "年龄:" + age;
- }
- }
运行结果
- public class SecondActivity extends Activity{
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- Intent intent = getIntent();
- Bundle bundle = intent.getExtras();
- System.out.println(bundle.getInt("test1"));
- System.out.println(bundle.getBoolean("test2"));
- System.out.println(intent.getSerializableExtra("test3"));
- }
- }
四、通过Bundle返回处理结果例子前面已经提到过了,Activity还提供了一个startActivityForResult(Intent intent, int requestCode)方法来启动其他Activity。这样就需要如下两个条件:
1、当前Activity需要重写onActivityResult(int requestCode, int resultCode, Intent intent)方法来获取返回的数据。
2、被启动的Activty需要调用setResult方法设置处理结果。
将上面的代码中startActivity改成startActivityForResult
SecondActivity.java
- Bundle bundle = new Bundle();
- bundle.putBoolean("test2", false);
- bundle.putSerializable("test3", new Person("大碗干拌", 2));
- intent.putExtras(bundle);
- startActivityForResult(intent, 0);
在MainActivity中重写onActivityResult方法
- package com.example.testintent;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- public class SecondActivity extends Activity{
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- Intent intent = getIntent();
- Bundle bundle = intent.getExtras();
- System.out.println(bundle.getInt("test1"));
- System.out.println(bundle.getBoolean("test2"));
- System.out.println(intent.getSerializableExtra("test3"));
- intent.putExtra("test4", "返回值");
- setResult(0, intent);
- finish();
- }
- }
执行结果
- @Override
- protected void onActivityResult(
- int requestCode, int resultCode, Intent intent) {
- if(requestCode == 0 && resultCode == 0){
- Bundle data = intent.getExtras();
- System.out.println(data.getString("test4"));
- }
- }