在Android的不同Activity之间传输数据并不像传输参数那样简单。我们需要做的就是把需要传输的数据绑定到intent对象上。如果我们需要传输的对象是一些简单的Object,比如String类型或者Integer类型,那事情就好做了:
String strinParam = "String Parameter"; Integer intParam = 5; Intent i = new Intent(this, MyActivity.class); i.putExtra("uk.co.kraya.stringParam", stringParam); i.putExtra("uk.co.kraya.intParam", intParam); startActivity(i);
但是如果我们想要传输自定义的对象就有一点复杂了。你可以简单地将类序列化(Serializable),然后让Java来善后。但是使用序列化对于Android来说会产生严重的性能问题。解决办法即时使用Parcelable。
package uk.co.kraya.android.demos.Parcelable; import android.os.Parcel; import android.os.Parcelable; /** * @author Shriram Shri Shrikumar * */ public class ObjectA implements Parcelable { private String strValue; private Integer intValue; /** * 一个没有parcel参数的默认构造方法 * */ public ObjectA() { ; }; /** * * 当我们利用parcel重建对象时需要这个构造方法 * * * @param in 读取这个对象的Parcel */ public ObjectA(Parcel in) { readFromParcel(in); } /** * getter * * @return strValue */ public String getStrValue() { return strValue; } /** * setter * * @param strValue */ public void setStrValue(String strValue) { this.strValue = strValue; } /** * getter * * @return */ public Integer getIntValue() { return intValue; } /** * setter * * @param intValue */ public void setIntValue(Integer intValue) { this.intValue = intValue; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { // 我们只需把每个字段写入parcel // 然后按写入的顺序读取出来 dest.writeString(strValue); dest.writeInt(intValue); } /** * * 构造方法会调用该方法,利用parcel为字段赋值 * * * @param in 重构对象的parcel */ private void readFromParcel(Parcel in) { //我们以parcel写入的相同顺序读取对象 strValue = in.readString(); intValue = in.readInt(); } /** * * 需要利用这个字段创建新的对象 * 要么以单个对象的形式,要么以数组的形式 * * * * 这意味着你能使用默认构造方法创建对象或者使用其它构造方法 */ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public ObjectA createFromParcel(Parcel in) { return new ObjectA(in); } public ObjectA[] newArray(int size) { return new ObjectA[size]; } }; }
上面的例子中有一个自定义类ObjectA,它实现了Parcelable,类里有两个字段,分别是int,String类型。考虑一种特殊情况,如果你的自定义类里引用了另外一个类。很明显,它们都必须实现Parcelable,但是要怎样集成它们呢?ObjectB向我们展示了一个实现了Parcelable的类里嵌套另一个实现了Parcelable的自定义类。
package uk.co.kraya.android.demos.Parcelable; import android.os.Parcel; import android.os.Parcelable; public class ObjectB implements Parcelable { private ObjectA obj; private Long longVal; public ObjectB() { ; } public ObjectA getObj() { return obj; } public ObjectB(Parcel in) { readFromParcel(in); } public void setObj(ObjectA obj) { this.obj = obj; } public Long getLongVal() { return longVal; } public void setLongVal(Long longVal) { this.longVal = longVal; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { // writeParcelable方法需要一个flags,但是很简单 dest.writeParcelable(obj, flags); // 和ObjectA一样 dest.writeLong(longVal); } private void readFromParcel(Parcel in) { // readParcelable needs the ClassLoader readParcelable方法需要类加载器 // 类加载器能够从指定类得到 obj = in.readParcelable(ObjectA.class.getClassLoader()); // 和ObjectA一样 longVal = in.readLong(); } public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public ObjectB createFromParcel(Parcel in) { return new ObjectB(in); } public ObjectB[] newArray(int size) { return new ObjectB[size]; } }; }
当我们在写Parcel时,我们需要向它传flags参数(非常简单)。当我们读取Parcel时,我们需要一个类加载器(classloader),这个类加载器能够从实现Parcelable的母的类获取(还是很简单吧)
最后,我们是这样传输parcelable对象的。
ObjectA obj = new ObjectA(); // Set values etc. Intent i = new Intent(this, MyActivity.class); i.putExtra("com.package.ObjectA", obj); startActivity(i);
是不是很简单,对吧?
接下来是读取parcelable对象。
public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle b = getIntent().getExtras(); ObjectA obj = b.getParcelable("com.package.ObjectA"); } }
当然,如果它真的真的太容易了,那。。我们就失业了。。
Over...
1楼Neacy_Zz4天前 14:16看的舒服~。ecshop数据结构
ecs_account_log // 用户账目日志表
ecs_activity // 活动表(代码,名称,开始,结束,描述)
ecs_ad // 广告表(位置,类型,名称,链接,图片,开始,结束,广告主相关信息,点击,
是否显示)
ecs_admin_action // 管理权限分配(父类ID,权限代码)
ecs_admin_log // 管理日志(登陆时间,登陆管理员ID,操作描述,IP)
ecs_admin_message // 管理员留言(发送者ID,接收者ID,发送日期,阅读日期,是否
已读,是否删除,标题,内容)
ecs_admin_user // 管理员管理(用户名,email ,密码,加入时间,最后登陆时间,最后
登陆IP,权限等)
ecs_adsense // 广告相关统计(来源广告,来源位置,点击)
ecs_ad_position // 广告位(名称,宽,高,描述,样式)
ecs_area_region // 配送区域关联(配送区域ID,具体地址ID)
ecs_article // 文章(分类ID,标题,内容,作者,作者email ,关键字,类型,是否显示,
添加时间,文件地址,打开类型)
ecs_article_cat // 文章分类(名称,类型,关键字,描述,排序,是否导航显示)
ecs_attribute // 商品属性(分类,名称,选择样式,类型,值,检索类型,排序,是否关
联)
ecs_bonus_type // 红包(名称,金额,发放起始日期,发放结束日期,使用起始日期,使
用结束日期,发放类型,金额下限(按订单发放),金额上限)
ecs_booking_goods // 缺货登记(登记用户ID,email ,电话,商品ID,描述,数量,登
记时间,是否已处理,处理管理员,处理时间,处理备注)
ecs_brand // 品牌(名称,logo,描述,链接,排序,是否显示)
ecs_card // 祝福贺卡(名称,图片,费用,免费额度,描述)
ecs_cart // 购物车(用户ID,session_id ,商品ID,商品编号,商品名称,市场价,购买
价,数量,属性,是否真实商品,扩展代码,父类ID,类型,是否赠品,能否处理)
ecs_category // 商品分类(名称,关键字,描述,父类ID,排序,是否有子类,模板文件,
数量单位,是否导航显示)
ecs_collect_goods // 收藏(用户ID,商品ID,收藏时间)
ecs_comment // 评论(类型,类型ID,email ,用户名,内容,评星,添加时间,IP,状
态,父类ID)
ecs_feedback // 用户留言(父类ID,用户ID,用户名,email,标题,类型,内容,时间,
图片,是否回复)
ecs_friend_link // 友情链接(名称,链接,logo,排序)
ecs_gift // 赠品(送赠品活动ID,商品ID,赠品价格)
ecs_gift_type // 送赠品活动(名称,发送类型,相关参数,数量,开始,结束)
ecs_goods // 商品(分类ID,名称,点击,品牌ID,供应商名称,库存,重量,市场价,
售价,fitting_price(未知),促销价,促销开始日期,结束日期,警告数量,关键字,简介,
描述,缩略图,图,原图,是否真实商品,扩展代码,是否上架,是否单独销售,是否关联,
配件关联,是否赠品,能否成为赠品,单位,添加时间,排序,是否回收,精品,新品,推
荐,热销,红包ID,更新日期,商品类型,商品备注,首页轮播)
ecs_goods_article // 商品文章关联(gid,aid )
ecs_goods_attr // 商品属性(商品ID,属性ID,属性值,属性附加价)
ecs_goods_cat // 未知
ecs_gallery // 商品相册(商品ID,图片,描述,缩略图,原图)
ecs_goods_type // 商品类型(名称,状态)
ecs_group_buy // 团购(商品ID,结束日期,价格阶梯,限购数量,描述,订购量,订单,
赠送积分数,流程,押金,是否完成)
ecs_group_goods // 配件(父类ID,商品ID,配件价格)
ecs_link_goods // 商品关联(商品ID,关联ID,单双向)
ecs_mail_templates // 邮件样式(代码,是否html,名称,样式,最后修改日期)
ecs_member_price // 会员价(商品ID,会员等级,会员价)
ecs_order_action // 订单处理(订单ID,处理用户,订单状态,配送状态,支付状态,处
理时间,备注)
ecs_order_goods // 订单-商品(订单ID,商品ID,商品名称,商品编号,商品数量,市
场价,订单价,商品属性,配送数量,是否真实商品,扩展代码,父类ID,是否赠品)
ecs_order_info // 订单信息(好多(-_-|||略...)
ecs_pack // 包装(名称,图片,费用,免费额,描述)
ecs_payment // 支付工具(代码,名称,费用,描述,排序,配置,状态,is_cod(未知))
ecs_pay_log // 支付记录(略)
ecs_plugins // 插件(代码,版本,库,签名,安装日期)
ecs_region // 地方数据(没什么好说的)
ecs_sessions // 保存session 的(也没什么好说的(嗯?为什么要加个“也”呢))
ecs_shipping // 配送(代码,名称,描述,保价费,support_cod(未知),状态)
ecs_shipping_area // 配送区域(序列配置)
ecs_shop_config // 设置(父类ID,代码,类型,范围,文件夹,值)
ecs_snatch // 夺宝奇兵(活动ID,商品ID,最小价,最大价,定价,积分消耗)
ecs_snatch_log // 夺宝奇兵出价记录(还是没什么好说的)
ecs_stats // 访问记录(时间,IP,访问次数,浏览器,系统,语言,地区,来源域名,来
源地址,关键字,进入链接)
ecs_tag // 用户标签(不说)
ecs_template // 模板区域(文件名,区域,模板库,排序,id,数量,类型,模板)也不
怎么清楚
ecs_users // 会员(一些会员信息)
ecs_user_account // 会员帐户(用户ID,管理员,总额,添加时间,支付时间,管理备注,
用户备注,处理类型,支付工具,是否支付)
ecs_user_address // 用户收货地址(略)
ecs_user_bonus // 用户红包(红包ID,红包编号,用户ID,使用时间,订单ID,是否已
发邮件)
ecs_user_rank // 会员等级(名称,积分最小限额,最大限额,折扣,是否显示价格,特
殊会员)
ecs_virtual_cart // 虚拟卡(商品ID,卡号,密码,添加时间,失效时间,是否已卖完,
编号,crc32校验码)
ecs_vote // 投票(名称,开始,结束,能否多选,统计)
ecs_vote_log // 投票记录(投票ID,IP,时间)
ecs_vote_option // 投票内容(投票ID,条目名称,条目统计)
对于日前暴露的“深圳地铁因信号系统受干扰发生暂停故障”事件,一位参与该事故调查的相关人士给新浪科技发来了详细情况说明,其认为,列车急停确实 是因为受到便携式WIFI路由器影响,但这是因为地铁使用的“车-地”通信使用的频率和普通WLAN设备相同,但便携式WIFI路由器使用2.4G频段频 率是合法的。
深圳地铁受WIFI干扰原因分析
据悉,调查显示,今年7月以来,深圳地铁蛇口线和环中线列车陆续因信号系统受干扰发生暂停故障。11月以来,由于发生次数频繁,引发了各界对地铁安全运行问题的普遍关注。
调查的初步结论是:乘客随身的MIFI干扰了地铁信号系统的车-地通信,造成指令异常导致列车急停。
据悉,故障发生后,深圳地铁集团在当地无线电管理局的配合下进行了故障定位测试。在排除各种可能因素后,将原因锁定在乘客随身携带的WIFI路 由器(MIFI),开展了便携式WIFI路由器打开、关闭状态下的对比测试,测试表明:便携式WIFI路由器打开,信号系统指令异常,列车急停;便携式 WIFI路由器关闭,信号系统正常。由此,地铁公司认为是便携式WIFI路由器干扰了信号系统。
但有一点值得关注:深圳地铁龙岗线也采用相同的CTBC信号系统,迄今尚未有被干扰案例发生。
深圳地铁“车-地”通信的技术背景
技术资料显示:基于无线通信技术的CBTC系统车-地通信通常采用基于IEEE 802.11标准的无线局域网技术。
基于无线通信技术的国际、国内CBTC系统(Communication - Based Train Control)通常采用IEEE 802.11协议实现轨旁定向天线与车载天线之间的通信。目前大多使用2.4GHz频段频率,最大发射功率为200毫瓦(其他WLAN设备为100毫 瓦)。
由于CBTC系统车-地通信使用的频率和普通WLAN设备相同,发射功率仅比普通设备大1倍(大3dB)。因此,如果乘客在地铁列车上使用WIFI路由器,有可能对其通信造成干扰。
国家对2.4G频段的管理要求
关于用户使用WIFI是否合法?调查显示,2.4GHz是非牌照频段,符合发射功率限制等技术要求的各类无线电通信设备及工业、科学和医疗等非无线通信设备均可使用。
2.4GHz属于非牌照频段(unlicense),便携式WIFI路由器使用该频段频率是合法的,使用2.4GHz频段频率的地铁车-地通信设备如果符合国家型号核准及其它相关要求也是合法的。
2.4GHz频段管理规定主要包括两个文件:一个是《关于调整2.4GHz频段发射功率限值及有关问题的通知》(信部无[2002]353号)另一个是《微功率(短距离)无线电设备管理暂行规定》( 信部[1998]178号)。
其中《关于调整2.4GHz频段发射功率限值及有关问题的通知》第二条称:2.4GHz频段作为无线局域网、无线接入系统、蓝牙技术设备、点对 点或点对多点扩频通信系统等各类无线电台站的共用频段。第四条内容称呼“设置2.4GHz频段的无线电台站,按照信息产业部发布的《微功率(短距离)无线 电设备暂行规定》(信部[1998]178号)进行管理,其无线电发射设备均须取得国家无线电管理机构核发的型号核准证。为便于查找干扰和协调,在室外环 境设置使用2.4GHz频段无线电台站应报所在省、自治区、直辖市无线电管理机构备案”。
而对于如何处理,该文件规定:“在该频段内的无线电台站之间产生干扰,原则上不受保护,应自行解决或协商解决。为便于协调而需查找干扰源,可请当地无线电管理机构协助查找”。
另外一个文件《微功率(短距离)无线电设备管理暂行规定》第六条则规定“使用微功率无线电设备不需办理无线电电台执照手续,但必须接受无线电管理办事机构对其产品性能指标进行必要的检查或测试”。
因此,根据国家有关规定,在该频段内的无线电台站之间产生干扰,原则上不受保护,应由被干扰方自行解决或双方协商解决。