Parcelable使用的一个地方就是在进程间传递一个自定义的较为复杂的对象,对Parcelable学习了一下写下自己的观点。

将一个对象比如说一个名字为Cartoon的自定义类,由一个activity传递到另外一个activity去,这个时候就要用到Parcelable了。首先我们先构建一个bean。

package com.example.sendobjfromactivity.bean;import android.graphics.Bitmap;public class Cartoon {private Bitmap figure;private String name;private String creator;public Bitmap getFigure() {return figure;}public void setFigure(Bitmap figure) {this.figure = figure;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getCreator() {return creator;}public void setCreator(String creator) {this.creator = creator;}
}

这就是我们要传输的数据的格式,下面就思考,要将其在线程间进行传输,就要对其实现序列化,在Android中也就是实现Parcelable接口,这个借口中需要我们实现的主要方法有writeToParcel,describe,ContentsParcelable.Creator<?>。完成完成序列化是依靠writeToParcel方法,而对对象进行反序列化并且返回一个对象实例的是依靠ContentsParcelable.Creator<?>。

下面来看这样一段代码,ParcelableCartoon类实现了Parcelable接口

package com.example.sendobjfromactivity.bean;import android.graphics.Bitmap;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;public class ParcelableCartoon implements Parcelable {private Cartoon cartoon;private static final String MSG = "MESSAGE"; public ParcelableCartoon(Cartoon cartoon){Log.i(MSG, "ParcelableCartoon::ParcelableCartoon@Cartoon");this.cartoon = cartoon;}// 将对象写入Parcel容器中去// 完成对对象的序列化/*** Flatten this object in to a Parcel.* * @param dest The Parcel in which the object should be written.* @param flags Additional flags about how the object should be written.* May be 0 or {@link #PARCELABLE_WRITE_RETURN_VALUE}.*/@Overridepublic void writeToParcel(Parcel dest, int flags) {Log.i(MSG, "ParcelableCartoon::writeToParcel");dest.writeString(cartoon.getName());dest.writeString(cartoon.getCreator());dest.writeParcelable(cartoon.getFigure(), PARCELABLE_WRITE_RETURN_VALUE);}// 完成对序列化的对象反序列化public static final Parcelable.Creator<ParcelableCartoon> CREATOR = new Parcelable.Creator<ParcelableCartoon>(){// 从Parcel容器中获取序列化的对象,并将其反序列化,得到该对象的实例/*** Create a new instance of the Parcelable class, instantiating it* from the given Parcel whose data had previously been written by* {@link Parcelable#writeToParcel Parcelable.writeToParcel()}.* * @param source The Parcel to read the object's data from.* @return Returns a new instance of the Parcelable class.*/@Overridepublic ParcelableCartoon createFromParcel(Parcel source) {Log.i(MSG, "ParcelableCartoon::Parcelable.Creator::createFromParcel");return new ParcelableCartoon(source);}@Overridepublic ParcelableCartoon[] newArray(int size) {Log.i(MSG, "ParcelableCartoon::Parcelable.Creator::newArray");return new ParcelableCartoon[size];}};public ParcelableCartoon(Parcel in){Log.i(MSG, "ParcelableCartoon::ParcelableCartoon@Parcel");cartoon = new Cartoon();String name = in.readString();cartoon.setName(name);cartoon.setCreator(in.readString());cartoon.setFigure((Bitmap)in.readParcelable(Bitmap.class.getClassLoader()));}public Cartoon getCartoon() {Log.i(MSG, "ParcelableCartoon::getCartoon");return cartoon;}@Overridepublic int describeContents() {Log.i(MSG, "ParcelableCartoon::describeContents");return 0;}
}

在该类中用英文的注释引用了Android文档中的注释。在该类中涉及到一个Parcel,它是一个容器,它的主要任务是对需要序列化的对象进行写入,对需要反序列化的对象进行写出(构造一个实例)。

完成了这些,就可以对对象进行序列化了,也就是说我们可以传递对象了。

下面完成俩个activity,一个负责发送数据,一个用来接收数据。

SendObjFromActivity.java完成发送

package com.example.sendobjfromactivity;import java.io.InputStream;import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;import com.example.sendobjfromactivity.bean.Cartoon;
import com.example.sendobjfromactivity.bean.ParcelableCartoon;public class SendObjFromActivity extends Activity {private Button sendData;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);sendData = (Button)this.findViewById(R.id.button1);sendData.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {Cartoon cartoon = new Cartoon();cartoon.setName("Android");cartoon.setCreator("Google");InputStream is = getResources().openRawResource(R.drawable.ic_launcher);Bitmap bitmap = BitmapFactory.decodeStream(is);cartoon.setFigure(bitmap);Intent intent = new Intent(SendObjFromActivity.this, ReceiveObjActivity.class);// 完成对象的序列化操作ParcelableCartoon parcelableCartoon = new ParcelableCartoon(cartoon);intent.putExtra("msg", parcelableCartoon);startActivity(intent);}});}
}

ReceiveObjActivity.java完成对数据的接收

package com.example.sendobjfromactivity;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;import com.example.sendobjfromactivity.bean.Cartoon;
import com.example.sendobjfromactivity.bean.ParcelableCartoon;public class ReceiveObjActivity extends Activity {private ImageView showImage;private TextView showText;@Overrideprotected void onCreate(Bundle savedInstanceState) {Log.i("MESSAGE", "进入到了另外的一个activity中去");super.onCreate(savedInstanceState);setContentView(R.layout.display_obj);showImage = (ImageView)this.findViewById(R.id.imageView1);showText = (TextView)this.findViewById(R.id.textView1);Intent intent = getIntent();ParcelableCartoon parcelableCartoon = (ParcelableCartoon) intent.getParcelableExtra("msg");Cartoon cartoon = parcelableCartoon.getCartoon();showImage.setImageBitmap(cartoon.getFigure());showText.setText(cartoon.getName()+"\n"+cartoon.getCreator());}
}

在这个程序中会调用Parcelable.Creator<ParcelableCartoon>内的方法,来完成反序列化。

需要到两个xml布局文件:display_obj.xml,main.xml。比较简单不再叙述。

在AndroidManifest.xml中配置下activity。这样就完成了一个小的数据传输程序了,看下运行结果

在控制台中输出来的信息

这样可以看出来Parcelable的运行方式以及顺序。

转载于:https://www.cnblogs.com/xinyuyu/p/3715926.html

Android Parcelable的介绍与使用相关推荐

  1. android parcelable 详细介绍

    想要在两个activity之间传递对象,那么这个对象必须序列化,Android中序列化一个对象有两种方式,一种是实现Serializable接口,这个非常简单,只需要声明一下就可以了,不痛不痒.但是a ...

  2. Kotlin on Android 开发环境介绍

    Kotlin 被 Google 采纳为 Android 开发一级编程语言,到现在也一年多了,我们团队从去年 10 月份开始部分项目尝试用 Kotlin 开发,到现在决定推广到全部项目,因为一旦用上 K ...

  3. Android AIDL使用介绍(2)自定义数据类型的传递

    1.背景 默认情况下,AIDL只支持下列数据类型: Java八种基础数据类型(如 int.long.char.boolean 等); String字符串: CharSequence字符序列: List ...

  4. Android混淆规则介绍

    Android混淆规则介绍 写在前面的话 APP上线推广,免不得是需要混淆加固的,况且劳动成果不易又会有谁希望自己的APP被破解抄袭呢.鉴于此方显本片文章的通用型和重要意义. 混淆简介 Android ...

  5. Android Fragment 基本介绍

    Android Fragment 基本介绍 Android Fragment 基本介绍 Fragment Android是在Android 3.0 (API level 11)开始引入Fragment ...

  6. Android Parcelable

    Android Parcelable 后面再补充 http://www.cnblogs.com/huanyou/p/5594475.html 转载于:https://www.cnblogs.com/f ...

  7. Android Pmem相关介绍

    http://fangjian0518.blog.163.com/blog/#m=0 Android Pmem相关介绍 2011-10-18 09:40:26|  分类: Android PMEM | ...

  8. AS插件-Android Parcelable code generator.

    概述 生成实现了Parcelable接口的代码的插件 下载安装 1.在线安装 输入 Android Parcelable code generator ,点击安装即可,安装之后 重启,会看到上图选中部 ...

  9. Android AIDL使用介绍(3) 浅说AIDL背后的Binder

    1.背景 在前面的博客中,我们已经学会了使用AIDL进行跨进程通信,AIDL的使用比较简单,可实际上跨进程通信是一个相当复杂的过程,例如进程A是怎么找到进程B的,如果有一个进程C冒充进程A,进程B又该 ...

最新文章

  1. 剖析ASP.NET下部构造
  2. linux_kernel下载网站
  3. csdn如何在开头生成目录
  4. 马斯克:“星链”卫星已能提供服务
  5. 浅谈Excel开发:九 Excel 开发中遇到的常见问题及解决方法
  6. [置顶] HTML5 实现小车动画效果(Canvas/CSS3/JQuery)
  7. Django 笔记3 -- URL
  8. 【2012百度之星/资格赛】B:小诺爱USB设备
  9. BZOJ 3991: [SDOI2015]寻宝游戏
  10. Hammer.js移动端触屏框架的使用
  11. 计算器 - 栈的应用
  12. MySQL Workbench 导入导出乱码解决方法
  13. mysql的txid是什么_mysql-存储引擎
  14. 多说评论如何显示最近访客
  15. linux系统测网速工具
  16. uint 数据类型理解
  17. matlab实现CAPM模型
  18. python远程监控_Python实现远程端口监控实例
  19. LOL全英雄皮肤爬虫
  20. Layui写后台登录页面 蓝奏云 下载

热门文章

  1. ES6 module 简单整理
  2. css中关于居中的那点事儿
  3. Windows 10离线安装.NET Framework 3.5
  4. 软件框架设计的艺术----读书总结
  5. Nginx PHP 使用 limit_req,limit_conn 限制并发,外加白名单
  6. VMware扩大硬盘后修改Linux逻辑卷大小
  7. ruby调用java代码
  8. visio 2010 修改 默认字体 字号大小 方法
  9. WinXP不能共享Win7的打印机的解决方法
  10. css游戏代码_介绍CSSBattle-第一个CSS代码搜寻游戏