前面我们分析到ViewRootImpl.java通过Surface拿到Canvas进行图像数据填充:
public class Surface implements Parcelable {
今天我们来讲讲Android的Parcel和Parcelable:
Parcelable类的官方解释文字:
Interface for classes whose instances can be written to and restored from a Parcel.
我的理解:Parcelable接口表示通过Parcel进行写入内存(序列化)和恢复(反序列化)。
官方Parcelable例子:
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();
}
}
其中:
- describeContents() 一般默认实现就可以(return 0),只有特殊情况下需要返回1。
- writeToParcel() :写入内存方法 也就是序列化方法
- createFromParcel() 从内存中恢复Parcelable对象,也就是反序列化
跟踪源码我们可以发现: writeInt实现是 Native层的Parcel.cpp
跟踪源码可以发现
//写入方法
@CriticalNative
private static native int nativeWriteInt(long nativePtr, int val);
@CriticalNative
private static native int nativeWriteLong(long nativePtr, long val);
//读取方法
@FastNative
private static native String nativeReadString8(long nativePtr);
@FastNative
private static native String nativeReadString16(long nativePtr);
通过JNI可以找到
{"nativeWriteInt", "(JI)V", (void*)[android_os_Parcel_writeInt](https://cs.android.com/android/platform/superproject/+/master:libnativehelper/tests/JniSafeRegisterNativeMethods_test.cpp;drc=fe54112f40c78e99ed63a75a52f3f137df0c6477;l=901?q=nativeWriteInt)}
android_os_Parcel_writeInt --->Parcel.writeInt:
static int android_os_Parcel_writeInt(jlong nativePtr, jint val) {
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
return (parcel != NULL) ? parcel->writeInt32(val) : OK;
}
Parcel.cpp中会将数据存储到内存中 //TODO