上一篇中我们透过源码看到了Parcel背后的机制,本质上把它当成一个Serialize就可以了,只是它是在内存中完成的序列化和反序列化,利用的是连续的内存空间,因此会更加高效。

我们接下来要说的是Parcel类如何应用。就应用程序而言,最常见使用Parcel类的场景就是在Activity间传递数据。没错,在Activity间使用Intent传递数据的时候,可以通过Parcelable机制传递复杂的对象。

下面来看一下简单的代码:

UserInfo类,实现了Parcelable接口:

package com.demo.entity;

import java.util.ArrayList;
import java.util.HashMap; import android.os.Parcel;
import android.os.Parcelable; /**
* 用户信息,实现Parcelable接口
* String,int,String[],ArrayList<HashMap<String,Object>>这四种类型测试
* @author weijiang204321
*
*/
public class UserInfo implements Parcelable{ private String id;
private String name;
private int age;
private String[] boyfriendAry = new String[3];
private ArrayList<HashMap<String,SonInfo>> listData = new ArrayList<HashMap<String,SonInfo>>();
private SonInfo sonInfo; public UserInfo(){
} public UserInfo(String id,String name,int age,String[] boyfriendAry,ArrayList<HashMap<String,SonInfo>> listData){
this.id = id;
this.name = name;
this.age = age;
this.boyfriendAry = boyfriendAry;
this.listData = listData;
} public UserInfo(Parcel source){
id = source.readString();
name = source.readString();
age = source.readInt();
sonInfo = source.readParcelable(SonInfo.class.getClassLoader());
source.readStringArray(boyfriendAry);
source.readList(listData, SonInfo.class.getClassLoader());
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public SonInfo getSonInfo(){
return sonInfo;
} public void setSonInfo(SonInfo sonInfo){
this.sonInfo = sonInfo;
} public String[] getBoyfriendAry() {
return boyfriendAry;
} public void setBoyfriendAry(String[] boyfriendAry) {
this.boyfriendAry = boyfriendAry;
} public ArrayList<HashMap<String, SonInfo>> getListData() {
return listData;
} public void setListData(ArrayList<HashMap<String, SonInfo>> listData) {
this.listData = listData;
} @Override
public int describeContents() {
return 0;
} //进行序列化存储
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(id);
dest.writeString(name);
dest.writeInt(age);
dest.writeParcelable(sonInfo, Parcelable.PARCELABLE_WRITE_RETURN_VALUE); dest.writeStringArray(boyfriendAry);
dest.writeList(listData);
} public static final Parcelable.Creator<UserInfo> CREATOR = new Creator<UserInfo>() {
@Override
public UserInfo[] newArray(int size) {
return new UserInfo[size];
} //将Parcel对象反序列化为UserInfo
@Override
public UserInfo createFromParcel(Parcel source) {
return new UserInfo(source);
}
}; }

同样SonInfo类也要实现Parcelable接口:

package com.demo.entity;

import android.os.Parcel;
import android.os.Parcelable; public class SonInfo implements Parcelable{ private String id;
private String name; public SonInfo(){ } public SonInfo(String id,String name){
this.id = id;
this.name = name;
} public SonInfo(Parcel source){
this.id = source.readString();
this.name = source.readString();
} public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} @Override
public int describeContents() {
return 0;
} @Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(id);
dest.writeString(name);
} public static final Parcelable.Creator<SonInfo> CREATOR = new Creator<SonInfo>() {
@Override
public SonInfo[] newArray(int size) {
return new SonInfo[size];
} //将Parcel对象反序列化为UserInfo
@Override
public SonInfo createFromParcel(Parcel source) {
return new SonInfo(source);
}
}; }

下面来看一下测试类:

MainActivity类,在这里面进行数据的封装,然后传递到StubActivity类中:

package com.demo.parcel;

import java.util.ArrayList;
import java.util.HashMap; import android.app.Activity;
import android.content.Intent;
import android.os.Bundle; import com.demo.entity.SonInfo;
import com.demo.entity.UserInfo; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Intent intent = new Intent(this,StubActivity.class);
ArrayList<HashMap<String,SonInfo>> listData = new ArrayList<HashMap<String,SonInfo>>();
HashMap<String,SonInfo> tempMap = new HashMap<String,SonInfo>();
tempMap.put("one_child", new SonInfo("001_1","jiangwei_one_child"));
listData.add(tempMap); UserInfo userInfo = new UserInfo("001","jiangwei",24,new String[]{"张三","李四","王五"},listData);
SonInfo sonInfo = new SonInfo();
sonInfo.setId("001_1");
sonInfo.setName("jiangwei_child");
userInfo.setSonInfo(sonInfo);
intent.putExtra("userinfo", userInfo);
startActivity(intent); } }

下面就是StubActivity类,在这个类中将读出数据进行显示:

package com.demo.parcel;

import java.util.ArrayList;
import java.util.HashMap; import android.app.Activity;
import android.os.Bundle;
import android.util.Log; import com.demo.entity.SonInfo;
import com.demo.entity.UserInfo; public class StubActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_stub); UserInfo userInfo = (UserInfo)this.getIntent().getParcelableExtra("userinfo");
SonInfo sonInfo = userInfo.getSonInfo(); String[] boyfriend = userInfo.getBoyfriendAry();
for(int i=0;i<boyfriend.length;i++){
Log.e("boyfriend_name:",boyfriend[i]);
} ArrayList<HashMap<String,SonInfo>> listData = userInfo.getListData();
for(int j=0;j<listData.size();j++){
SonInfo temp_soninfo = listData.get(j).get("one_child");
Log.e("OneChildId:",temp_soninfo.getId()+"");
Log.e("OneChildName:",temp_soninfo.getName()+"");
} Log.e("UserId:",userInfo.getId()+"");
Log.e("UserName:",userInfo.getName()+"");
Log.e("UserAge:",userInfo.getAge()+"");
Log.e("Son_id:",sonInfo.getId()+"");
Log.e("Son_name:",sonInfo.getName()+""); } }

运行结果:

这样就成功了使用了Parcelable进行数据的传输

Android中的Parcel机制(下)的更多相关文章

  1. Android中的Parcel机制 实现Bundle传递对象

    Android中的Parcel机制    实现了Bundle传递对象    使用Bundle传递对象,首先要将其序列化,但是,在Android中要使用这种传递对象的方式需要用到Android Parc ...

  2. 探索Android中的Parcel机制(上)

    一.先从Serialize说起 我们都知道JAVA中的Serialize机制,译成串行化.序列化……,其作用是能将数据对象存入字节流其中,在须要时又一次生成对象.主要应用是利用外部存储设备保存对象状态 ...

  3. Android中的Parcel机制(上)

    一.先从Serialize说起 我们都知道JAVA中的Serialize机制,译成串行化.序列化--,其作用是能将数据对象存入字节流当中,在需要时重新生成对象.主要应用是利用外部存储设备保存对象状态, ...

  4. 重温Android中的消息机制

    引入: 提到Android中的消息机制,大家应该都不陌生,我们在开发中不可避免的要和它打交道.从我们开发的角度来看,Handler是Android消息机制的上层接口.我们在平时的开发中只需要和Hand ...

  5. 转: Android中的签名机制

    转载请注明出处:http://www.blogjava.net/zh-weir/archive/2011/07/19/354663.html Android APK 签名比对 发布过Android应用 ...

  6. 谈谈对Android中的消息机制的理解

    Android中的消息机制主要由Handler.MessageQueue.Looper三个类组成,他们的主要作用是 Handler负责发送.处理Message MessageQueue负责维护Mess ...

  7. Android中Alarm的机制

    本次给大家分析的是Android中Alarm的机制所用源码为最新的Android4.4.4.首先简单介绍如何使用Alarm并给出其工作原理,接着分析Alarm和Timer以及Handler在完成定时任 ...

  8. 浅析Android中的消息机制(转)

    原博客地址:http://blog.csdn.net/liuhe688/article/details/6407225 在分析Android消息机制之前,我们先来看一段代码: public class ...

  9. 浅析Android中的消息机制(转)

    在分析Android消息机制之前,我们先来看一段代码: public class MainActivity extends Activity implements View.OnClickListen ...

随机推荐

  1. tengine日志切割-配置分钟级别日志自动切割

    tengine日志切割-配置分钟级别日志自动切割 安装 以安装最新版本的tengine-2.1.2版本 下载连接 tengine支持许多变量 变量 $conn_requests 当前请求在长连接上的序 ...

  2. 获取微信企业的corpID,sercret,access_token,部门设置列表

    获取微信企业的corpID,sercret,access_token,部门设置列表   zabbix调用微信发短信可能用到的一些变量,获取方式如下: 1.corpID(公司ID) 在我的企业--企业信 ...

  3. 第十一次 LL(1)文法的判断,递归下降分析程序

    1. 文法 G(S): (1)S -> AB (2)A ->Da|ε (3)B -> cC (4)C -> aADC |ε (5)D -> b|ε 验证文法 G(S)是不 ...

  4. 「CTS2019 | CTSC2019」随机立方体 解题报告

    「CTS2019 | CTSC2019」随机立方体 据说这是签到题,但是我计数学的实在有点差,这里认真说一说. 我们先考虑一些事实 如果我们在位置\((x_0,y_0,z_0)\)钦定了一个极大数\( ...

  5. css3 动画+动画库

    css3 动画 实现原理 1.transition 过渡:https://www.runoob.com/cssref/css3-pr-transition.html 语法:( transition的 ...

  6. websocke和http的区别

    同:建立在TCP之上,同http一样通过TCP来传输数据 不同: HTTP协议为单向协议,即浏览器只能向服务器请求资源,服务器才能将数据传送给浏览器,而服务器不能主动向浏览器传递数据.分为长连接和短连 ...

  7. cgo 和 Go 语言是两码事

    cgo不是Go 借用 JWZ的一句话 有些人,当他们面临一个问题时,认为“我知道,我会使用 cgo ”.那么现在,他们有了两个问题. 最近有人在 Gopher 的 Slack Channel 上使用 ...

  8. solidity代码

    http://www.tryblockchain.org/ 教你如何舒服的看solidity代码 最近智能合约随着区块链技术的发展越发收到广大技术人员的重视! 其中最被看好的以太坊就是一个提供智能合约 ...

  9. AndroidFine Error:Annotation processors must be explicitly declared now.

    环境 Android Studio 3.0 Gradle 3.0.0 gradle 4.1 Error Error:Execution failed for task ':app:javaPreCom ...

  10. jeecg接口开发及权限实现原理

    接口开发使用的框架 jeecg本身是基于 Spring MVC 框架搭建的,因此,使用 Spring MVC 框架的 RESTful API 功能来进行接口开发就是顺理成章的事了. 接口的拦截与鉴权 ...