第一、四大组件间数据传递方式:
启动四大组件通过Intent对象来实现,Intent的功能包括启动四大组件以及相关信息+传递数据。
其中传递数据Intent提供了putExtra和对应的getExtra方法来实现:
putExtra和getExtra 其实是和Bundle
put和get方法一一对应的,在Intent类中有一个Bundle的mExtras成员变量
所有的putExtra和getExtra方式实际是调用mExtras对象的put和get方法进行存取。
所以正常情况下 四大组件间传递数据直接通过putExtra和getExtra方法存取即可,无需再创建一个bundle对象。
Intent putExtra方法:
Intent putExtra(String name, Bundle value)
Intent putExtra(String
name, Parcelable[] value)
Intent putExtra(String name, Serializable
value)
Intent putExtra(String name, Parcelable value)
Intent putExtra(String
name, int[] value)
Intent putExtra(String name, float value)
Intent
putExtra(String name, byte[] value)
Intent putExtra(String name, long[]
value)
Intent putExtra(String name, float[] value)
Intent
putExtra(String name, long value)
Intent putExtra(String name, String[]
value)
Intent putExtra(String name, boolean value)
Intent
putExtra(String name, boolean[] value)
Intent putExtra(String name, short
value)
Intent putExtra(String name, double value)
Intent putExtra(String
name, short[] value)
Intent putExtra(String name, String value)
Intent
putExtra(String name, byte value)
Intent putExtra(String name, char[]
value)
Intent putExtra(String name, CharSequence[] value)
Intent
putExtras(Intent src)
Intent putExtras(Bundle extras)
Intent
putIntegerArrayListExtra(String name, ArrayList<Integer> value)
Intent
putParcelableArrayListExtra(String name, ArrayList<? extends Parcelable>
value)
Intent putStringArrayListExtra(String name, ArrayList<String>
value)
Intent getExtra方法:
double[] getDoubleArrayExtra(String name)
double getDoubleExtra(String
name, double defaultValue)
Bundle getExtras()
int getFlags()
float[]
getFloatArrayExtra(String name)
float getFloatExtra(String name, float
defaultValue)
int[] getIntArrayExtra(String name)
int getIntExtra(String
name, int defaultValue)
ArrayList<Integer>
getIntegerArrayListExtra(String name)
long[] getLongArrayExtra(String
name)
long getLongExtra(String name, long defaultValue)
Parcelable[]
getParcelableArrayExtra(String name)
<T extends Parcelable>
ArrayList<T> getParcelableArrayListExtra(String name)
<T extends
Parcelable> T getParcelableExtra(String name)
Serializable
getSerializableExtra(String name)
short[] getShortArrayExtra(String
name)
short getShortExtra(String name, short defaultValue)
String[]
getStringArrayExtra(String name)
ArrayList<String>
getStringArrayListExtra(String name)
String getStringExtra(String
name)
Intent 的mExtras对象:
private Bundle mExtras;
public Intent putExtra(String name, Parcelable value) {
if
(mExtras == null) {
mExtras = new Bundle();
}
mExtras.putParcelable(name, value);
return this;
}
第二、自定义对象的传递:
通过intent 传递自定义对象的方法有两个,第一是实现Serialization接口,第二是实现Parcelable接口。
首选推荐Parceable,android中的很多数据类型都是实现Serialable接口方式来传递的,例如
Intent、Bundle、Bitmap、Uri等等。
android Parcelable化的提供了一个接口 Parcelable和一个工具类 Parcel
Parcelable:一个规范接口,定义实现Parcelable需要实现的功能
Parcel:数据存取的工具类,供用户在实现Parcelable接口时存取自定义数据用,也供系统传递数据时使用。
Parcelable实现要点:需要实现三个东西
1)writeToParcel
方法。该方法将类的数据写入外部提供的Parcel中.声明如下:
writeToParcel (Parcel dest, int flags)
具体参数含义见javadoc
2)describeContents方法。没搞懂有什么用,反正直接返回0也可以
3)静态的Parcelable.Creator接口,本接口有两个方法:
createFromParcel(Parcel
in) 实现从in中创建出类的实例的功能
newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话(return new
T[size])即可。估计本方法是供外部类反序列化本类数组使用。
android doc示例代码:
public class MyParcelable implements Parcelable {
private int mData;
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mData);
}
public static final Parcelable.Creator<MyParcelable> CREATOR
= new Parcelable.Creator<MyParcelable>() {
public MyParcelable createFromParcel(Parcel in) {
return new MyParcelable(in);
}
public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
};
private MyParcelable(Parcel in) {
mData = in.readInt();
}
}
一
序列化原因:
1.永久性保存对象,保存对象的字节序列到本地文件中;
2.通过序列化对象在网络中传递对象;
3.通过序列化在进程间传递对象。
二
至于选取哪种可参考下面的原则:
1.在使用内存的时候,Parcelable
类比Serializable性能高,所以推荐使用Parcelable类。
2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
3.Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,
也不提倡用,但在这种情况下,还是建议你用Serializable 。
实现:1
Serializable 的实现,只需要继承 implements Serializable
即可。这只是给对象打了一个标记,系统会自动将其序列化。2
Parcelabel 的实现,需要在类中添加一个静态成员变量 CREATOR,这个变量需要继承 Parcelable.Creator
接口。
分享到:
相关推荐
在Android应用开发中,Intent是连接各个组件(如Activity、Service等)的桥梁,用于传递数据和启动意图。当我们需要在Activity之间传递复杂的数据结构,比如自定义的泛型类对象时,Intent就显得尤为重要。本文将深入...
此外,`Parcelable`接口是Android特有的,它允许对象在Intent或Binder之间高效地传递。尽管实现Parcelable比使用Gson更繁琐,但在性能敏感的场景下,它是更好的选择。特别是对于大型数据模型,Parcelable可以显著...
Kotlin cross-platform / multi-format reflectionless serialization Kotlin serialization consists of a compiler plugin, which automatically produces visitor code for classes, and runtime library, ...
【Kotlinx.Serialization详解】 Kotlinx.Serialization是一个强大的开源库,专门为Kotlin编程语言提供了跨平台的序列化解决方案。这个库允许开发者将数据对象转换成字节流或JSON等不同格式,反之亦然,这对于数据...
在Android中,Intent本身并不支持直接传递复杂对象,如自定义对象或集合,但我们可以利用序列化或者Parcelable接口来实现这一功能。 **序列化(Serialization)** 序列化是将对象转换为字节流的过程,这样就可以...
### Java Streams 和 Serialization 详解 在Java编程语言中,数据的读取与写入操作是通过流(Streams)实现的。此外,为了保存对象的状态,Java提供了序列化(Serialization)机制。本文将深入探讨Java中的流操作...
`System.Runtime.Serialization`提供了一系列的类来支持这两种操作,如`DataContractSerializer`和`XmlSerializer`,它们分别用于基于数据契约和XML的序列化。 **二、数据契约(DataContract)** 数据契约是.NET中...
虽然它主要用于在Intent中传递对象,但也可以用于备份,不过需要手动编写序列化和反序列化代码。 4. **云同步服务**: Google提供了Cloud Save API,可以用来备份应用数据到云端,这样即使设备丢失或更换,也能恢复...
通过这种方式,Kotlinx.Serialization与Retrofit2的结合,使得我们可以优雅地处理网络请求中的数据转换,避免了手动解析JSON字符串的繁琐工作。这种结合也充分利用了Kotlin的特性,如类型安全和编译时检查,提高了...
另一种方法是使用Parcelable接口,它提供了更高效的数据交换方式,适合用于Intent和Binder传递数据。 3. **Android的Gson库** Google提供的Gson库是另一种流行的选择,它可以将Java对象转换为JSON字符串,反之亦然...
kotlinx-serialization-compiler-plugin.jar
System.Runtime.Serialization.dll是.NET Framework中的一个重要组件,它属于Microsoft的基础类库,主要负责数据序列化和反序列化的功能。数据序列化是将对象的状态转换为可以存储或传输的形式的过程,而反序列化则...
`oslo.serialization` 是一个在PyPI上发布的Python库,它专注于数据序列化和反序列化功能。这个2.2.0版本的压缩包`oslo.serialization-2.2.0.tar.gz`包含了该库的源代码,供开发者使用。 **oslo.serialization 概述...
sirenix.serialization.dll
Paper is a fast NoSQL data storage for Android that lets you save/restore Java/Kotlin objects using efficient Kryo serialization. Class structure changes handled automatically. What's new in 2.1 Get...
Android Bundle格式支持Kotlinx序列化。 用法 使用@Serializable注释数据模型: import kotlinx.serialization.Serializable enum class Type { HUMAN , MONKEY } @Serializable data class Email ( val value : ...
在C++编程中,序列化是一个重要的概念,它允许我们将对象的状态转换为可存储或可传输的数据格式,以便稍后能够恢复原始状态。Boost.Serialization库是C++社区广泛使用的序列化工具,它提供了丰富的功能来处理各种...
2. **类型支持**:Boost.Serialization支持多种数据类型,包括基本类型(如int、float、string)、容器(如std::vector、std::map)、智能指针、自定义类对象等。通过继承`boost::serialize`并重载`save`和`load`...