Android必备知识点之IPC(进程间通信/跨进程通信)
1.进程和线程的区别:
进程一般指一个执行单元,在手机上就体现为一个程序或一个应用。一个进程可以包含多个线程。一般情况下,一个进程中可以只有一个线程,主线程(UI线程),但大多数情况,例如联网操作,则开启多个线程做耗时操作。
2.IPC场景:
1>增加应用可使用的内存空间(Android对单个应用所使用的最大内存空间做了限制)
2>需要另外开启进程做一些工作
3>通过跨进程获取数据,例如通讯录数据
首先关注一些应用内部的多进程
1>在AndroidMenifest中指定:android:process=”xxx”,若没有指定,则默认进程名就是包名
2>通过JNI在native层去fork一个新的进程。(特殊,我也不会)
只研究第一个,可以通过shell来查看进程:adb shellps
强调一点,”:xxx”开头的进程属于当前应用的私有进程,其他应用组件不可以和它在同一个进程中,进程名不以”:”开头的,属于全局进程
3.多进程模式的运行机制
若在工具类中创建静态全局变量,A进程中更改了变量值,B进程中不会得到被更改的变量值,也就是说不通进程间数据不共享。所有运行在不同进程中的四大组件,只要它们之间通过内存共享数据,都会共享失败。
原因:Android为每一个应用分配了一个独立的虚拟机,或者说为每个进程都分配了一个独立的虚拟机,不同虚拟机在内测分配上有不同的地址空间,导致在不同的虚拟机中访问同一个类的对象会产生许多分副本。
Serializable 和Parcelable的区别:
Serializable是Java中的序列化接口,使用简单但是开销大,序列化和反序列化过程需要大量的I/O操作.Parcelable是Android中的序列化方式,效率高,但是使用麻烦,主要用在内存序列化上,一般讲对象序列化后通过网络传输,过程就会稍显负责,可以用Serializable,其他情况推荐使用Parcelable
4.Android中IPC的方式
1>Binder:(AIDL)
是Android中的一个类,它实现了IBinder接口。从Android应用层来说,Binder是客户端和服务端进行通信的媒介,当bindService的时候,服务器会返回一个包含服务端业务调用的Binder对象,用过这个Binder对象,客户端就可以获取服务端提供的服务或者数据。
2>Intent putExtra
设置方法
intent.putExtra("aaa", "bbbb");
获取方法
this.getIntent().getXXXExtra("aaa")
3>Bundle
传输:
Bundle bundle = new Bundle();
bundle.putXXX("key", "value");
intent.putExtras(bundle);
获取:
Bundler bundle = getIntent().getExtras();
XXX xx = bundle.getXXX("key");
4>文件共享
5>Messager
6>ContentProvider
7>Socket
socket也叫套接字,分为流式套接字(TCP)和用户数据报套接字(UDP)
Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信。两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据。而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求。
基于TCP协议的Socket:
服务器端首先声明一个ServerSocket对象并且指定端口号,然后调用Serversocket的accept()方法接收客户端的数据。accept()方法在没有数据进行接收的处于堵塞状态。(Socketsocket=serversocket.accept()),一旦接收到数据,通过inputstream读取接收的数据。
客户端创建一个Socket对象,指定服务器端的ip地址和端口号(Socketsocket=newSocket(“172.168.10.108”,8080);),通过inputstream读取数据,获取服务器发出的数据(OutputStreamoutputstream=socket.getOutputStream()),最后将要发送的数据写入到outputstream即可进行TCP协议的socket数据传输。