Android中的Parcel机制(下)
上一篇中我们透过源码看到了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机制(下)的更多相关文章
- Android中的Parcel机制 实现Bundle传递对象
Android中的Parcel机制 实现了Bundle传递对象 使用Bundle传递对象,首先要将其序列化,但是,在Android中要使用这种传递对象的方式需要用到Android Parc ...
- 探索Android中的Parcel机制(上)
一.先从Serialize说起 我们都知道JAVA中的Serialize机制,译成串行化.序列化……,其作用是能将数据对象存入字节流其中,在须要时又一次生成对象.主要应用是利用外部存储设备保存对象状态 ...
- Android中的Parcel机制(上)
一.先从Serialize说起 我们都知道JAVA中的Serialize机制,译成串行化.序列化--,其作用是能将数据对象存入字节流当中,在需要时重新生成对象.主要应用是利用外部存储设备保存对象状态, ...
- 重温Android中的消息机制
引入: 提到Android中的消息机制,大家应该都不陌生,我们在开发中不可避免的要和它打交道.从我们开发的角度来看,Handler是Android消息机制的上层接口.我们在平时的开发中只需要和Hand ...
- 转: Android中的签名机制
转载请注明出处:http://www.blogjava.net/zh-weir/archive/2011/07/19/354663.html Android APK 签名比对 发布过Android应用 ...
- 谈谈对Android中的消息机制的理解
Android中的消息机制主要由Handler.MessageQueue.Looper三个类组成,他们的主要作用是 Handler负责发送.处理Message MessageQueue负责维护Mess ...
- Android中Alarm的机制
本次给大家分析的是Android中Alarm的机制所用源码为最新的Android4.4.4.首先简单介绍如何使用Alarm并给出其工作原理,接着分析Alarm和Timer以及Handler在完成定时任 ...
- 浅析Android中的消息机制(转)
原博客地址:http://blog.csdn.net/liuhe688/article/details/6407225 在分析Android消息机制之前,我们先来看一段代码: public class ...
- 浅析Android中的消息机制(转)
在分析Android消息机制之前,我们先来看一段代码: public class MainActivity extends Activity implements View.OnClickListen ...
随机推荐
- 在CMake中启用VS2017的C++17特性
VS2017的C++17特性默认并未开启,需要在编译参数中手动开启.找到项目的CMakeLists.txt,在查找编译器的代码后面加入如下内容即可. ") include(CheckCXXC ...
- Unity HOME
{ https://unity.com/cn?_ga=2.134655153.1528856053.1574826116-818341090.1574826116 }
- [CQOI2011]放棋子 题解(dp+组合数学)
Description Input 输入第一行为两个整数n, m, c,即行数.列数和棋子的颜色数. 第二行包含c个正整数,即每个颜色的棋子数. 所有颜色的棋子总数保证不超过nm. N,M<=3 ...
- ssm+mysql 时间显示相差了12小时的问题 Gson
怎么改时区,连接字符串加时区都无效,后来才发现原来返回的是对的,并不是时区问题. 后来感觉是gson问题,关键是在其他数据表并没有这个问题. 把 gson改成 Gson gson = new Gson ...
- snmp相关网址
https://blog.csdn.net/wangcg123/article/details/53837737 https://www.linuxidc.com/Linux/2012-05/6114 ...
- PHP面试 PHP基础知识 九(面向对象)
面向对象 PHP的类权限控制修饰符 public(公共的) . protected(受保护的).private(私有的) public :最高权限 可以在类的内部使用 可以在类的外部使用 可以 ...
- 18、Linux命令对服务器CPU进行监控
我刚开始做性能测试的时候,什么也不懂,就只知道压测.什么时候把系统压瘫痪什么时候结束.但是系统因为什么瘫痪却不是很清楚,后来开始研究服务器性能监控,运用到工作中,提高了不少生产力,下面就把我常用的命令 ...
- SQL中Truncate语法
转自:http://www.studyofnet.com/news/555.html 本文导读:删除表中的数据的方法有delete,truncate, 其中TRUNCATE TABLE用于删除表中的所 ...
- PAT_A1041#Be Unique
Source: PAT A1041 Be Unique (20 分) Description: Being unique is so important to people on Mars that ...
- 剑指offer——74求1+2+3+n
题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 题解: 利用类的构造和析构 //利用类的构 ...