Android-Intent意图传递数据
Posted 原创Android 努力学习 专一安卓 持之以恒
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android-Intent意图传递数据相关的知识,希望对你有一定的参考价值。
Intent意图传递基本数据类型:
OuterActivity 激活启动 OneActivity 用Intent携带基本数据类型:
/** * Intent意图传递数据到另外一个Activity */ public void intentToData(View view) { Intent intent = new Intent(this, TwoActivity.class); intent.putExtra("name", "乔峰"); intent.putExtra("age", 40); intent.putExtra("fight", 800.65); startActivity(intent); }
OneActivity接收Intent基本数据类型:
TextView tvInfo = findViewById(R.id.tv_info); Intent intent = getIntent(); String name = intent.getStringExtra("name"); int age = intent.getIntExtra("age", 18); double fight = intent.getDoubleExtra("fight", 0.0); tvInfo.setText("name:" + name + " ,age:" + age + " ,fight:" + fight);
OuterActivity 激活启动 OneActivity 用Intent携带基本数据类型:
把数据封装到Bundle里面:
/** * Intent意图传递数据到另外一个Activity */ public void intentToData(View view) { Intent intent = new Intent(this, TwoActivity.class); // 使用Bundle对象来包装数据(Bundle是对Map进行来封装处理,只要是看到putXXX的,一定是对Map进行来封装) Bundle bundle = new Bundle(); bundle.putString("name", "乔峰"); bundle.putInt("age", 40); bundle.putDouble("fight", 800.65); intent.putExtras(bundle); startActivity(intent); }
OneActivity接收Intent基本数据类型:
注意:⚠️ 在接收 Bundle 包装的数据 的时候,和获取基本数据类型的方式一模一样,直接intent.getStringExtra();
TextView tvInfo = findViewById(R.id.tv_info); Intent intent = getIntent(); String name = intent.getStringExtra("name"); int age = intent.getIntExtra("age", 18); double fight = intent.getDoubleExtra("fight", 0.0); tvInfo.setText("name:" + name + " ,age:" + age + " ,fight:" + fight);
Intent传递对象 (Serializable):
需要理解一个概念:序列化就是把内存的数据存在文件里,反序列化就是把文件里的数据读取处理让内存显示
Serializable是Java io 包 中的序列化接口
写Dog一个类,实现Serializable接口,Dog类才可以被Intent传递
package liudeli.activity.intent.entity; import java.io.Serializable; public class Dog implements Serializable { public int id; public String name; public String color; @Override public String toString() { return "Dog{" + "id=" + id + ", name=\'" + name + \'\\\'\' + ", color=\'" + color + \'\\\'\' + \'}\'; } }
Intent意图传递Serializable对象:
/** * Intent意图传递数据到另外一个Activity */ public void intentToData(View view) { Intent intent = new Intent(this, TwoActivity.class); Dog dog = new Dog(); dog.id = 1; dog.name = "阿黄"; dog.color = "金黄色"; intent.putExtra("dogObject", dog); startActivity(intent);
接收Intent意图传递过来的Serializable对象:
TextView tvInfo = findViewById(R.id.tv_info); Intent intent = getIntent(); Dog dog = (Dog) intent.getSerializableExtra("dogObject"); tvInfo.setText("dog.id:" + dog.id + "\\n" + "dog.name:" + dog.name + "\\n" + "dog.color:" + dog.color);
Intent传递对象 (Parcelable),android开发推荐用Parcelable,消耗低,效率高:
需要理解一个概念:序列化就是把内存的数据存在文件里,反序列化就是把文件里的数据读取处理让内存显示
Serializable是Java io 包 中的序列化接口
Parcelable是 android.os 包 中的序列化接口
已经有来Serializable序列化接口,用来传递对象,Android为什么还要搞个Parcelable序列化接口?
答:Serializable是针对JVM虚拟机的,Serializable在Android中运行,效率低;
而Parcelable是Android专门设计的接口,消耗低,效率高些。
写Cat一个类,实现Parcelable接口,Cat类才可以被Intent传递
package liudeli.activity.intent.entity; import android.os.Parcel; import android.os.Parcelable; public class Cat implements Parcelable { public int id; public String name; public double body; public Cat() { } /** * 此构造方法是用于读取数据,顺序必须和writeToParcel方法一模一样 * @param in */ protected Cat(Parcel in) { id = in.readInt(); name = in.readString(); body = in.readDouble(); } public static final Creator<Cat> CREATOR = new Creator<Cat>() { @Override public Cat createFromParcel(Parcel in) { return new Cat(in); } @Override public Cat[] newArray(int size) { return new Cat[size]; } }; @Override public int describeContents() { return 0; } /** * 此方法是写入数据,顺序必须和Cat(Parcel in)构造方法一模一样 * @param dest * @param flags */ @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(id); dest.writeString(name); dest.writeDouble(body); } }
Intent意图传递Parcelable对象:
Intent intent = new Intent(this, TwoActivity.class); // 传递Parcelable接口实现类 Cat cat = new Cat(); cat.id = 1000; cat.name = "小白"; cat.body = 6.6; intent.putExtra("catObject", cat); startActivity(intent);
接收Intent意图传递过来的Parcelable对象:
Intent intent = getIntent(); Cat cat = intent.getParcelableExtra("catObject"); tvInfo.setText("cat.id:" + cat.id + "\\n" + "cat.name:" + cat.name + "\\n" + "cat.body:" + cat.body);
Parcelable为什么效率高,消耗低?
答:因为Parcelable内部的实现是 包装属性 传递属性 读取属性,而不是真正的把对象传递过去,所以效率高,消耗低。
以上是关于Android-Intent意图传递数据的主要内容,如果未能解决你的问题,请参考以下文章
android-Intent and IntentFilter