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::[email protected]");
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}.
*/
@Override
public 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.
*/
@Override
public ParcelableCartoon createFromParcel(Parcel source) {
Log.i(MSG, "ParcelableCartoon::Parcelable.Creator::createFromParcel");
return new ParcelableCartoon(source);
}

@Override
public ParcelableCartoon[] newArray(int size) {
Log.i(MSG, "ParcelableCartoon::Parcelable.Creator::newArray");
return new ParcelableCartoon[size];
}

};

public ParcelableCartoon(Parcel in){
Log.i(MSG, "ParcelableCartoon::[email protected]");
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;
}

@Override
public 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;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sendData = (Button)this.findViewById(R.id.button1);
sendData.setOnClickListener(new OnClickListener(){

@Override
public 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;

@Override
protected 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的运行方式以及顺序。

时间: 2024-10-28 11:23:07

Android Parcelable的介绍与使用的相关文章

Android多媒体开发介绍(转)

Android多媒体开发介绍 转自:http://blog.csdn.net/reiliu/article/details/9060557 一.       多媒体架构 基于第三方PacketVideo公司的OpenCORE来实现,支持所有通用的音频/视频/静态图像格式,包括:MPEG4.H.264.MP3.AAC.AMR.JPG.PNG.GIF等.从功能上分为两部分,一是音/视频的回放(PlayBack),二是音视频的纪录(Recorder). CODEC(编解码器)使用OpenMAX 1L

我的Android第三章:Android的组件介绍

小编摘录了Android文档介绍Android四大组件的基本内容,感觉文档的内容写的很详细所以小编将它写入了博客 Android 使用Java语言开发.Android SDK 工具编译代码-以及任意数据并连同相关资源打包进一个Android 包内,它是一个以.apk 为后缀的压缩文件. 一个 .apk 文件中的 所有代码就是一个程序.这个.apk文件就用于在Android设备上安装这个程序. 一旦安装成功,这个Android程序就拥有了自己独立的运行沙盒(沙盒是在受限的安全环境中运行应用程序的一

Android控件介绍

Android控件介绍 多选按钮(CheckBox) CheckBox有两个常用的事件,OnClickListener事件和OnClickChangeListener事件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_w

转android intent action 介绍大全

一些常用的Intent: Uri Action 功能 备注 geo:latitude,longitude Intent.ACTION_VIEW 打开地图应用程序并显示指定的经纬度   geo:0,0?q=street+address Intent.ACTION_VIEW 打开地图应用程序并显示指定的地址   http://web_address Intent.ACTION_VIEW 打开浏览器程序并显示指定的URL   https://web_address Intent.ACTION_VIEW

Android NDK 简单介绍、工具安装、环境配置

NDK全称:Native Development Kit. 1.NDK是一系列工具的集合. * NDK提供了一系列的工具,帮助开发人员高速开发C(或C++)的动态库,并能自己主动将so和java应用一起打包成apk.这些工具对开发人员的帮助是巨大的. * NDK集成了交叉编译器,并提供了对应的mk文件隔离平台.CPU.API等差异,开发者仅仅须要简单改动mk文件(指出"哪些文件须要编译"."编译特性要求"等),就能够创建出so. * NDK能够自己主动地将so和Ja

Android Parcelable

Android Parcelable 后面再补充 http://www.cnblogs.com/huanyou/p/5594475.html

Android Fragment的介绍与使用(案例Demo)

应用场景: 众所了解Android上的界面展示都是通过Activity实现的,但是Activity也有它的局限性,同样的界面在手机上显示可能很好看,在平板上就未必了.为了让界面可以在平板上更好地展示,Android在3.0版本引入了Fragment(碎片)功能,它非常类似于Activity,可以像Activity一样包含布局.Fragment通常是嵌套在Activity中使用的.首先需要注意,Fragment是在3.0版本引入的,如果你使用的是3.0之前的系统,需要先导入android-supp

Android Fragment 基本介绍

Android Fragment 基本介绍 Fragment Android是在Android 3.0 (API level 11)开始引入Fragment的. 可以把Fragment想成Activity中的模块,这个模块有自己的布局,有自己的生命周期,单独处理自己的输入,在Activity运行的时候可以加载或者移除Fragment模块. 可以把Fragment设计成可以在多个Activity中复用的模块. 当开发的应用程序同时适用于平板电脑和手机时,可以利用Fragment实现灵活的布局,改善

Android通讯录数据库介绍与基本操作(增删改查)

Android通讯录数据库介绍与基本操作(增删改查) 2014年2月21日 Android通讯录管理总结 这几天导师安排我一个任务就是研究一下Android通讯录获取联系人.通话记录.短信的方法,还有看看不同Android版本之间的异同是否能做到兼容之类的事情.Android通讯录这一块,我个人感觉是挺乱的,网上一堆关于查询本地数据库获取联系人的方法,但似乎都没有仔细说明数据有哪些重要的表,它们之间有什么联系.下面是本人查询资料总结的一下知识点,方便童鞋们以后用到. http://xys2891