Activity跳转时的数据传递

Intent是Activity与Activity之间,Activity与Service之间传递参数的介质,使用Intent和Bundle在组件之间传递数据,而这两种通常实现的是Java基本对象类型和String的传递。

在实际项目中,页面之间传值,除了以上几种,经常还有传递Object对象、List类型、List类型和全局变量等等的需求。

由于Activity跳转有两种方式,为此进行数据传递一共有两种方式:隐式跳转传递数据,显示跳转传递数据。

隐式跳转传递数据

由于隐式跳转的时候,是可以通过data进行传递数据的。为此,通过案例来说明隐式跳转如何传递数据。

案例1:
由于我们实现Activity从A跳转B的时候,在A中使用data进行传递数据的,那么我们在B中通过getData就可以得到里面传递过来的数据了。

AActivity

public void click(View v){

Intent intent = new Intent();
    //指定要跳转到TwoActivity
    intent.setClass(this, TwoActivity.class);
    //设置要跳转匹配的Action
    intent.setAction("a.b.c");
    //设置要跳转匹配的Data 和 mimeType
    intent.setDataAndType(Uri.parse("exaple:123"), "text/name");
    //启动Activity
    startActivity(intent); 
}

BActivity

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_two);
    //获取由上一个Activity传递过来的Intent对象
    Intent intent = getIntent();
    //获取这个Intent对象的Data数据
    Uri data = intent.getData();
    //将数据转换为字符串 并通过Log进行输出
    Log.i("TwoActivity", data.toString());
}

显式跳转传递数据

Activity跳转时,可以把数据封装在intent对象中。

intent中可以封装的数据类型:八大基本数据类型和字符串及它们的数组,还有实现了序列化接口的对象,还有bundle对象

数据也可以先封装至Bundle,再把Bundle封装至intent

案例1: 八大基本数据类型和字符串及它们的数组

传递数据

    //跳转到SecondActivity  
    Intent intent = new Intent(this, SecondActivity.class);
   //把数据封装至intent中
    intent.putExtra("maleName", maleName);
    intent.putExtra("femaleName", femaleName);
   //启动Activity
    startActivity(intent);

获取数据

    //获取由上一个Activity传递过来的Intent对象
    Intent intent = getIntent();
    // 获取这个Intent对象的Extra中对应键的值
    String maleName = intent.getStringExtra("maleName");
    String femaleName = intent.getStringExtra("femaleName");

案例2:传递对象

Android中Intent传递类对象提供了两种方式一种是 通过实现Serializable接口传递对象,一种是通过实现Parcelable接口传递对象。要求被传递的对象必须实现上述2种接口中的一种才能通过Intent直接传递。

Intent中传递这2种对象的方法:
Bundle.putSerializable(Key,Object);  //实现Serializable接口的对象
Bundle.putParcelable(Key, Object); //实现Parcelable接口的对象

以下以最常用的Serializable方式为例 :

传递的对象为注册的用户信息 Person类

  1. 定义一个Person类 并实现Serializable即可即可

     public class Person implements Serializable{
    
        private String name;
        private int 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;
        }
        public Person(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
    
        public Person(){
    
        }
    }
    

2 传递Person对象

public void one(View v){
    Intent intent = new Intent(MainActivity.this, TwoActivity.class);
    intent.putExtra("Person", new Person("zhangsan", 18));
    startActivity(intent);
}

3.获取Person对象

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_two);

    Intent intent = getIntent();
    Person person =  (Person)intent.getSerializableExtra("Person");

    Log.i("TwoActivity", person.getName());
    Log.i("TwoActivity", person.getAge()+"");
}
以下以最常用的Parcelable方式为例 :

传递的对象为动物信息 Animal类
1. 定义一个Animal类 并实现Parcelable即可 并重写方法

public class Animal implements Parcelable{
    private String color;
    private int weight;

public String getColor() {
    return color;
}

public void setColor(String color) {
    this.color = color;
}

public int getWeight() {
    return weight;
}

public void setWeight(int weight) {
    this.weight = weight;
}



public Animal(String color, int weight) {
    super();
    this.color = color;
    this.weight = weight;
}

public Animal(){

}

@Override
public int describeContents() {
    //这里使用默认即可
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    //这里 方法名称为参数的类型  方法参数是 属性
    dest.writeString(color);
    dest.writeInt(weight);
}

//定义一个Parcelable.Creator<T> 类型的变量 并使用匿名内部类实现其对象
 public static final Parcelable.Creator<Animal> CREATOR = new Parcelable.Creator<Animal>() {

    @Override
    public Animal createFromParcel(Parcel source) {
        //定义Animal类对象 并给其赋值
        Animal anim = new Animal();
        //从Parcel中获取值并赋给属性
        anim.color = source.readString();
        anim.weight = source.readInt();
        //将对象返回
        return anim;
    }

    @Override
    public Animal[] newArray(int size) {
        //将参数size作为数组的大小 并返回
        return new Animal[size];
    }
};

}

2.传递Animal对象

public void two(View v){
    Intent intent = new Intent(MainActivity.this, ThreeActivity.class);
    intent.putExtra("Animal", new Animal("hongse", 20));
    startActivity(intent);
}

3 获取Animal对象

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_three);

    Intent intent = getIntent();
    Animal anim =  (Animal)intent.getParcelableExtra("Animal");

    Log.i("ThreeActivity", anim.getColor());
    Log.i("ThreeActivity", anim.getWeight()+"");
}

案例3:传递Bundle

先封装至Bundle,再把Bundle封装至intent
传递Bundle

    //跳转到SecondActivity  
    Intent intent = new Intent(this, SecondActivity.class);
    //Bundle中也可以用键值对封装数据,封装类型与intent一致
    Bundle extras = new Bundle();
    extras.putString("maleName", maleName);
    extras.putString("femaleName", femaleName);
    //将Bundle封装至intent中
    intent.putExtras(extras);
    //启动Activity
    startActivity(intent);

获取Bundle

    Intent intent = getIntent();
    String maleName = intent.getStringExtra("maleName");
    String femaleName = intent.getStringExtra("femaleName");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值