bundle.putSerializable 或者 bundle.putParcelable 传进去的对象一定要implements Parcelable 或者 Serializable 这两个接口。

Serializable  这个接口没有具体的方法,这个关键字主要是标识这个类在jdk编译的时候会被序列化处理。在序列化处理的过程中,会大量生成中间临时变量。可能引起GC操作。

对于Parcelable 这个接口:

为什么有Serializable,有它就有反序列化,有一个问题:我这边使用Java Serializable生成二进制文件,通过网络传输到其他设备上,此设备是Linux,那么如何使用C语言将其方序列化,读数据文件?能做到吗?

Parcel的存在主要是jvm 进程之间的通信,进程是占有系统资源的最小程序,其包含一个或者多个线程。进程之间的通信,其可以上升到应用之间的通信,所以基于Parcel,android系统有Binder IPC进程通信机制和AIDL开发。什么是通信?

通信:1.共享数据或者传递数据   2.通知对方调用自身的变量和代码执行指令

为什么非要让别人调用自己的资源执行自己的指令,比如:子线程要通知弹出窗口,那么自己不能做到,自己没有window服务,只能让UI线程去做。

为什么非要传递数据,直接让数据的可见性(对象的可见性)让两个线程或者进程可见不就可以了吗?可见性和生命周期直接相关的,可见性越大,那么生命周期越长。占内存!对于我们传统的传递对象,就是将对象的可见性扩大,如下图:

bundle在activity之间或者fragment之间使用Parcelable,Serializable传递对象是线程内部的数据交互,不属于线程或者进程间的通信。

但是有一个问题:jvm线程内部传递对象为何不能直接传,还需要序列化呢?但是handler传递消息是可以直接传递对象的。

Parcelable的使用:

publicclassDataBean implements Parcelable{

// 写数据进行保存
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(this.id);
        dest.writeString(this.Account);
        dest.writeString(this.name);
        dest.writeString(this.password);
        dest.writeInt(this.kind);
        dest.writeString(this.desc);
    }
    // 读数据进行恢复
    protected DataBean(Parcel in) {
        this.id = in.readInt();
        this.kind = in.readInt();
        this.password = in.readString();
        this.name = in.readString();
        this.Account = in.readString();
        this.desc = in.readString();
    }

intent.putExtra("data",data);

DataBean data = getIntent().getParcelableExtra("data");

注意的问题:顺序写进去的数据,读出来的时候也要按照这个顺序,否则数据就会错位。

为什么aidl或者IPC通信基于parcel:

从parcel的使用可以看出,parcel就是连续保存数据的单纯地址结构,它和jvm中的对象的结构有很大的不同。对于android系统,其应用都是跑在jvm上的,那么各个进程也是跑在j各个独立的vm上的,进程之间的通信是跨jvm,那么必然数据先是从一个jvm到普通Linux(android系统基于Linux内核)管理的内存,然后再读到另外的jvm中。那么不可能直接传递普通的Java对象,Java对象只有jvm才有的概念。parcel类似于基本数据的集合,对于传统的系统都是可以管理的。

对于windows系统,进程之间通信完全可以传指针或者数据结构,因为应用之间没有虚拟机的壁垒,大家都是直接和操作系统打交道。

bundle传递对象与Serializable、Parcelable接口理解和思考相关推荐

  1. ​Android中如何使用Intent在Activity之间传递对象[使用Serializable或者Parcelable]

    Android中如何使用Intent在Activity之间传递对象[使用Serializable或者Parcelable] 在Android中的不同Activity之间传递对象,我们可以考虑采用Bun ...

  2. java intent bundle_Android 通过Intent使用Bundle传递对象详细介绍

    Android 通过Intent使用Bundle传递对象 Android开发中有时需要在应用中或进程间传递对象,下面详细介绍Intent使用Bundle传递对象的方法. 被传递的对象需要先实现序列化, ...

  3. android bundle 对象,Android Bundle传递对象

    首先Android的Bundle是可以传递对象的.我们可以用Bundle b = new Bundle():b.putSerializable("key", 对象引用); 但是这样 ...

  4. java 传递intent_Android中使用Intent在Activity之间传递对象(使用Serializable或者Parcelable)的方法...

    Android中的不同Activity之间传递对象,我们可以考虑采用Bundle.putSerializable(Key,Object);也可以考虑采用Bundle.putParcelable(Key ...

  5. android 如何使用Parcelable接口

    今天,简单讲讲android如何使用Parcelable接口传递数据. 这个其实也很简单,之前我写过博客将关于Serializable接口传递对象,实现Parcelable接口也是为了传递对象,但效率 ...

  6. Serializable接口和Parcelable接口

    一.Serializable接口 在Java中,一般在定义实体类(entity class)时,会去实现Serializable接口,下面举例: 重点: 使用Serializable接口很简单,只需要 ...

  7. Android Intent之传递带有对象的集合(Serializable传递对象和对象集合)

    Android中Intent传递类对象提供了两种方式一种是 通过实现Serializable接口传递对象,一种是通过实现Parcelable接口传递对象. 要求被传递的对象必须实现上述2种接口中的一种 ...

  8. Intent之对象传递(Serializable传递对象和对象集合)

    Android中Intent传递类对象提供了两种方式一种是 通过实现Serializable接口传递对象,一种是通过实现Parcelable接口传递对象. 要求被传递的对象必须实现上述2种接口中的一种 ...

  9. Android:通过Intent传递对象、Parcelable

    1.对要传递的对象类型实现Parcelable: public class User implements Parcelable//对象必须实现Parcelable接口才可以putExtra(或者序列 ...

最新文章

  1. Data Mining with Big Data--阅读笔记
  2. 如何让AI机器人的对话更加自然?
  3. java编译命令 Linux,通过命令行在linux中编译Java类
  4. Beam概念学习系列之Pipeline Runners
  5. android targetapi版本低,我的Android进阶之旅------Android中高低API版本兼容使用@TargetApi或者@SuppressLint(NewApi)...
  6. 使用C#登录带验证码的网站
  7. azure机器学习_如何在Azure机器学习中使用JSON数据
  8. vsftpd 可以登录,无法写入和上传
  9. Mysql自增id用完怎么办?
  10. php加密解密函数,PHP加密解密的函数
  11. 大道至简——书摘与思考
  12. Spring框架 @ResponseBody注解 编码问题: 论设置 Accept 的重要性
  13. mc服务器小地图不显示玩家,为啥小地图莫名消失了 玩家:或许是它喝完随机饮料后 自己隐身了...
  14. 相关性分析:Pearson、Kendall、Spearman
  15. 内边距怎么设置html,如何设置内边距
  16. MATLAB实现遥感图像预处理——图像变换
  17. 点评互联网产品经理面试问题汇总(18问)
  18. 战争游戏红龙mod简介
  19. 班级聚会(reunion)
  20. 利用python爬取贝壳网租房信息

热门文章

  1. colab文件夹上传到github
  2. 2.11 矩阵和实数运算不同之处
  3. 【机器学习】Lasso回归(L1正则,MAP+拉普拉斯先验)
  4. Linux中自动删除n天前日志
  5. ant-design-pro使用服务器数据接口代理配置
  6. js 正则表达式 取反
  7. 命令行解析的规则以及Command Line Parser Library
  8. SQLserver语句命令
  9. 删除文件时,提示没权限删除文件怎么办
  10. C++字符串之一(字符表示)