温故而知新,可以为师,咦…
切入正题,下面介绍五种组件间的数据传递:
- 使用intent.putExtras()
我们最常用的一种方式,Intent对象适用于两个组件间点对点的数据传递,而不适合多个组件共享数据的场景。如果组件间需要传递的数据过大,那就不要全部读入到intent的extras中进行序列化传递,而应将数据放在外存储设备中,通过URI传递。一般我们startActivity中传递对象,那么至少就要序列化四次(包括序列化2次和反序列化2次)。
画的丑了… Intent先将对象序列化传递给组件管理服务(ActivityManagerService),经由组件管理服务反序列化,进行解析,再将对象序列化到activity,继而反序列化得到数据。 大概过程就是这样。(具体写入过程在ActivityManagerProxy)这样意味增加内存开销,耗费很多时间,数据的传输效率低。
文件进行数据共享
通过Context.openFileOutput()等函数创建的文件,都是应用的私有文件,存储在应用下的files文件目录下,只有本应用组件才可以进行读写或写入,只能作为本应用组件间共享数据的载体。如果想在不同应用的组件中传递数据,那么就要将数据传出到SD卡。缺点就是:读写操作的开销大全局数据共享
但是要注意onTerminate()不一定会被调用,所以不能依赖onTerminate(),可以提供一个函数在修改后直接写入,如果数据修改比较频繁就可以交给组件,比如activity在适当的时机写入(onPause)。不能夸应用访问(也就是跨进程),全局对内存占用时间一直到应用结束,对内存开销大。组件共享数据(Content Provider)
利用服务组件共享数据
在绑定服务下工作的服务,可以与调用组件建立双向的通信连接,利用进程间的通信进制在组件间传输数据。