Android Parcelable的介绍与使用
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的介绍与使用相关推荐
- android parcelable 详细介绍
想要在两个activity之间传递对象,那么这个对象必须序列化,Android中序列化一个对象有两种方式,一种是实现Serializable接口,这个非常简单,只需要声明一下就可以了,不痛不痒.但是a ...
- Kotlin on Android 开发环境介绍
Kotlin 被 Google 采纳为 Android 开发一级编程语言,到现在也一年多了,我们团队从去年 10 月份开始部分项目尝试用 Kotlin 开发,到现在决定推广到全部项目,因为一旦用上 K ...
- Android AIDL使用介绍(2)自定义数据类型的传递
1.背景 默认情况下,AIDL只支持下列数据类型: Java八种基础数据类型(如 int.long.char.boolean 等); String字符串: CharSequence字符序列: List ...
- Android混淆规则介绍
Android混淆规则介绍 写在前面的话 APP上线推广,免不得是需要混淆加固的,况且劳动成果不易又会有谁希望自己的APP被破解抄袭呢.鉴于此方显本片文章的通用型和重要意义. 混淆简介 Android ...
- Android Fragment 基本介绍
Android Fragment 基本介绍 Android Fragment 基本介绍 Fragment Android是在Android 3.0 (API level 11)开始引入Fragment ...
- Android Parcelable
Android Parcelable 后面再补充 http://www.cnblogs.com/huanyou/p/5594475.html 转载于:https://www.cnblogs.com/f ...
- Android Pmem相关介绍
http://fangjian0518.blog.163.com/blog/#m=0 Android Pmem相关介绍 2011-10-18 09:40:26| 分类: Android PMEM | ...
- AS插件-Android Parcelable code generator.
概述 生成实现了Parcelable接口的代码的插件 下载安装 1.在线安装 输入 Android Parcelable code generator ,点击安装即可,安装之后 重启,会看到上图选中部 ...
- Android AIDL使用介绍(3) 浅说AIDL背后的Binder
1.背景 在前面的博客中,我们已经学会了使用AIDL进行跨进程通信,AIDL的使用比较简单,可实际上跨进程通信是一个相当复杂的过程,例如进程A是怎么找到进程B的,如果有一个进程C冒充进程A,进程B又该 ...
最新文章
- 剖析ASP.NET下部构造
- linux_kernel下载网站
- csdn如何在开头生成目录
- 马斯克:“星链”卫星已能提供服务
- 浅谈Excel开发:九 Excel 开发中遇到的常见问题及解决方法
- [置顶] HTML5 实现小车动画效果(Canvas/CSS3/JQuery)
- Django 笔记3 -- URL
- 【2012百度之星/资格赛】B:小诺爱USB设备
- BZOJ 3991: [SDOI2015]寻宝游戏
- Hammer.js移动端触屏框架的使用
- 计算器 - 栈的应用
- MySQL Workbench 导入导出乱码解决方法
- mysql的txid是什么_mysql-存储引擎
- 多说评论如何显示最近访客
- linux系统测网速工具
- uint 数据类型理解
- matlab实现CAPM模型
- python远程监控_Python实现远程端口监控实例
- LOL全英雄皮肤爬虫
- Layui写后台登录页面 蓝奏云 下载