探索android中的parcel机制

探索android中的parcel机制

ID:6380278

大小:382.50 KB

页数:62页

时间:2018-01-12

探索android中的parcel机制_第1页
探索android中的parcel机制_第2页
探索android中的parcel机制_第3页
探索android中的parcel机制_第4页
探索android中的parcel机制_第5页
资源描述:

《探索android中的parcel机制》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、探索Android中的Parcel机制(上)一.先从Serialize说起我们都知道JAVA中的Serialize机制,译成串行化、序列化……,其作用是能将数据对象存入字节流当中,在需要时重新生成对象。主要应用是利用外部存储设备保存对象状态,以及通过网络传输对象等。 二.Android中的新的序列化机制在Android系统中,定位为针对内存受限的设备,因此对性能要求更高,另外系统中采用了新的IPC(进程间通信)机制,必然要求使用性能更出色的对象传输方式。在这样的环境下,Parcel被设计出来,其定位就是轻量级的高效的对象序列化和反序

2、列化机制。 三.Parcel类的背后在Framework中有parcel类,源码路径是:Frameworks/base/core/java/android/os/Parcel.java典型的源码片断如下:  [java]viewplaincopyprint?1./** 2. * Write an integer value into the parcel at the current dataPosition(), 3. * growing dataCapacity() if needed. 4. */  5.public fina

3、l native void writeInt(int val);  6.  7./** 8. * Write a long integer value into the parcel at the current dataPosition(), 9. * growing dataCapacity() if needed. 10. */  11.public final native void writeLong(long val);    从中我们看到,从这个源程序文件中我们看不到真正的功能是如何实现的,必须透过JNI往下走了。于是

4、,Frameworks/base/core/jni/android_util_Binder.cpp中找到了线索 [java]viewplaincopyprint?1.static void android_os_Parcel_writeInt(JNIEnv* env, jobject clazz, jint val)  2.{  3.    Parcel* parcel = parcelForJavaObject(env, clazz);  4.    if (parcel != NULL) {  5.        const s

5、tatus_t err = parcel->writeInt32(val);  6.        if (err != NO_ERROR) {  7.            jniThrowException(env, "java/lang/OutOfMemoryError", NULL);  8.        }  9.    }  10.}  11.  12.static void android_os_Parcel_writeLong(JNIEnv* env, jobject clazz, jlong val)  13.{

6、  14.    Parcel* parcel = parcelForJavaObject(env, clazz);  15.    if (parcel != NULL) {  16.        const status_t err = parcel->writeInt64(val);  17.        if (err != NO_ERROR) {  18.            jniThrowException(env, "java/lang/OutOfMemoryError", NULL);  19.       

7、 }  20.    }  21.}    从这里我们可以得到的信息是函数的实现依赖于Parcel指针,因此还需要找到Parcel的类定义,注意,这里的类已经是用C++语言实现的了。找到Frameworks/base/include/binder/parcel.h和Frameworks/base/libs/binder/parcel.cpp。终于找到了最终的实现代码了。有兴趣的朋友可以自己读一下,不难理解,这里把基本的思路总结一下:1.      整个读写全是在内存中进行,主要是通过malloc()、realloc()、memcpy

8、()等内存操作进行,所以效率比JAVA序列化中使用外部存储器会高很多;2.      读写时是4字节对齐的,可以看到#definePAD_SIZE(s)(((s)+3)&~3)这句宏定义就是在做这件事情;3.      如果预分配的空

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。