《Android开发艺术探索》IPC机制—1

来源:互联网 发布:遥感卫星数据 英文 编辑:程序博客网 时间:2024/06/06 11:03
今天看了《Android开发艺术探索》中的IPC机制,将读书笔记以自己的逻辑重新梳理一下。
     跨进程通信,要了解这个首先得明白什么是进程,什么是线程。进程和线程其实是两个完全不同的概念。从操作系统的角度上来说的话,线程是CPU中调度的最小单元,进程是执行单元。可以说进程和线程之间的关系是包含和被包含的关系。进程中可以只有一个线程,叫做UI线程,负责对界面的所有处理。在pc和移动端中是一个程序或者应用。
     为什么需要进程间的通信。有两个原因。第一个,扩大某个应用的内存大小,因为Android虚拟机对每个进程所分配的内存是有限,不同的设备所分配的内存大小不同,所以当一个进程的内存不够的时候,可以通过这种方式增加内存大小。第二种,是需要访问其它应用内的数据,这个时候,必须要通过进程的通信来实现对其他应用的数据访问。     
     指定应用的进程,通过在AndroidMainfiest中,指定组件的process属性,注意,进程是对Android中的组件而言,而不是针对某一个类中。在默认情况下,不指定process中的属性,默认是运行以包名为名的线程中。比如在Activity1中指定一个进程1,Activity2中指定进程2。同时有个静态类,里面有个静态属性code=0;在Activity1的onCreate方法中,将code改成2,打印log,再打开Activity2,也打印log,会发现第一个logcode是2,而第二个log仍然是1.所以不同进程间镜头常量不能共享。这是由于Android对每个进程都分配一个虚拟机,也就是有自己的内存空间。而这些常量只会做为副本存在每个进程中。因此通过简单的指定进程名来开启多线程都会无法进行。所以运行在不同线程的四大组件,只要他们之间通过内存来共享数据,都会共享失败。总结来说有以下几个问题:1.静态成员和单例模式完全失效。2。线程同步机制完全失效。sharedPreference的可靠性下降(同时好几个进程都对它进行读写操作,就有可能导致数据丢失)。4.Application多次创建。
     只有组件才能指定进程,而组件的数据传输需要进行序列化处理。因此序列化在跨进程间通信至关重要。序列化提供了两个接口,一个是java提供的serializable接口,这是一个空接口,只要继承,不需要做什么操作,系统会默认生成一个serialVersionUID,这个ID在序列化时候,写到文件中,在反序列时,和该类中的ID比较,一样的话才可以反序列成功。反序列的对象其实已经是另一个对象了。这个方法会执行大量的读写操作,相当耗性能。Android自己提供了一个接口,Parcelable,这个接口需要自己去完成序列化和反序列的方法。

     Binder是一个很深入的话题。这里暂时先了解它的使用和上层原理。Binder是进程间通信的一种方式,可以理解成一个虚拟的设备(这里我将他具象成办理银行卡填的单子),从应用层,Binder是一个对象,在bindService时候,客户端能获得服务端的Binder对象,通过这个对象可以获得服务端的服务和数据。它的工作原理我做了一个比喻,在和服务端进行通信的时候,能拿到一个binder对象(我需要让银行柜台人员给我办一张银行卡的服务,我能从柜台人员能那拿到一张单子),首先,客服端发出远程请求,(我要办理银行卡业务),客户端被挂起(我不能干其他事,比如回家,必须等的办卡这个服务结束),客户端通过binder写入服务端执行某个服务(方法)的参数(我通过这个表单写上办卡所需的个人信息),客户端走transact流程,service执行onTransact执行对应的方法,这个方法在线程池中执行(我说你开始办卡吧,柜台人执行办卡的工作),服务端将结果写入replay中,通过Binder对象返回(柜台人员通过表单夹带着办好的银行卡给我),客户端唤醒(我可以干其他事了)。

使用Messager,binder做为一个虚拟的设备,通过Messager信使,已经封装好了binder对象。从Messager的构造方法可以佐证这个结论。Messager的构造方法有两个,一个是传一个handler对象,另一个是传一个binder对象。工作方式。客户端和服务端能通信,简而言之,客户端通过使用服务端的messager对象发送消息,服务端的message对象通过自定义的handler处理特定的事情。其中,服务端中的Messager对象中已经存在了binder,因此把binder返回到客户端,客户端通过构造方法,就能拿到服务端的Messager了。而服务端要想让客户端做事情,必须在客户端第一次向服务端请求服务的时候,将自己的Messager对象也一起传递过去,这样双方都有了彼此的Messager,可以互相发送信息(这种策略真的吊!!!)如图:


原创粉丝点击