Android Activity间的通讯
本文参考文章
众所周知,安卓Activity间通讯使用Intent传输数据.
例如
//构造Intent对象并绑定数据
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("string_data", "hello");
intent.putExtra("int_data", 100);
startActivity(intent);
//接收数据
getIntent().getStringExtra("string_data");
getIntent().getIntExtra("int_data", 0);
像这种用法肯定很熟悉了.但是,上述方法使用Intent传输的数据类型是有限的,如果想用它来传输一个自定义的类型的对象,该怎么办呢?
通过查找资料,使用Intent传输对象的方法如下:
1.使对象实现Serializable接口
将我们自定义的类实现了Serializbale接口后,像添加一个String对象那样将自定义类的实例绑定给Intent对象即可,在target Activity中通过调用
getIntent.getSerializableExtra(String str);
即可实现自定义对象的传输.
2.使对象实现Parcelable接口
这种方法使用起来较为复杂,Parcelable接口是将对象分成多个小部分,每一部分都应是能绑定到Intent中的对象类型.
使用方法如下,具体实现可以参考原文
首先我们让自定义类去实现了Parcelable 接口,这样就必须重写describeContents()和writeToParcel()这两个方法。
其中describeContents()方法直接返回0就可以了,而writeToParcel()方法中我们需要调用Parcel的writeXxx()方法将自定义类中的字段一一写出。注意字符串型数据就调用writeString()方法,整型数据就调用writeInt()方法,以此类推。
除此之外,我们还必须在自定义类中提供一个名为CREATOR的常量,这里创建了Parcelable.Creator 接口的一个实现。
接着需要重写createFromParcel()和newArray()这两个方法,在createFromParcel()方法中我们要去读取刚才写出的类中的各字段,并创建一个对象进行返回,注意这里读取的顺序一定要和刚才写出的顺序完全相同。
上述内容是参考了优快云的文章,我在GitHub上找到一个安卓的USBSerial的库,其中作者用了一种方法也实现了Activity间自定义对象的传送,我感觉很是巧妙,所以我将它记下.
假设要从FirstActivity中将自定义类的MyClass的对象obj传送给SecondActivity.
1.定义FirstActivity类并完成初始化
public class FirstActivity extends CompatActivity{
//...
MyClass obj = new MyClass();
//...
}
2.定义SecondActivity并完成初始化
public class SecondActivity extends ConpatActivity{
//这里需要static
private static MyClass obj = null;
//...
//下面这个方法是关键
public static void getMyClass(Context context, MyClass obj)
{
this.obj = obj;
Intent intent = new Intent(context, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY);
context.startActivity(intent);
}
}
然后在FirstActivity中调用
SecondActivity.getMyClass(this, obj);
就是这样子,不需要Serializable和Parcelable就实现了两个Activity间的自定义对象的传递.
由于我的水平有限,有何不妥还望大家能不吝指正!谢谢!