改文章用来记录警示,以及给各位做个提醒。
跨进程通信是Android中绕不开的一个坑,使用的刀也能成为你的一把利器。比如,我们经常需要处理图片问题,但是图片这个问题最重要的就是你得小心翼翼的计算图片资源大小和内存的问题,一不小心OOM控制台上一波GG输出来了就。但是如果你善于使用多进程就不一样了。Android的机制在于会给每个进程都分配一个内存空间。如果你的程序启动后是20M,在加载了某些网页资源和数据后再去加载图片资源的时候不够了怎么办,那就再开一个进程,又得到重新的20M新资源,想想就觉得棒极了。
想法有了,但是有些问题我们需要面对。首先,你先开的进程数据是无法共享的。比如你一开始定义了一个静态变量,并且在代码中给这个变量附了值,但是当你再开了一个进程后想继续使用这个变量是无法得到他改变后的值得。同时多进程下线程的同步机制完全失效,静态成员和单例模式也全部失效,application再次重建。一个进程就相当于app重新启动了一次,大家伙所有的数据都得重来,谁说话也不好使。所以,我们就需要在多进程间通信。
多进程间通信有许多思路。
1.公用shareperference数据。但是有个问题,shareperference底层通过读写xml来实现文件存储的,并发读写都可能出现问题,更别说并发写了。所以一定要处理好并发问题。
2.共享文件读写。顾名思义,对同一个文件进行读写操作,同上,也需要考虑多并发问题。
3.Messenger。俗称信使,方便好用,用过Handler的都知道。
4.AIDL。用之利器,大杀器。
今天主要总结一瞎Messenger的使用。
多进程,首先我们需要两个进程。重建个app,我们以MainActivity作为主进程,通过MainActivity吊起一个服务,让服务来作为第二个进程。服务注册的时候只需要加一句 android:process=":service" 就好,这就是开启多进程的方式,后面那个参数是进程名。大家可以用adb查看当前的进程数量:
很好。两个进程已经起来了,那么如何通信呢。
Messenger和message很相似,我们在Service中创建Handler用来处理接收Activity传阿里的数据,只用来打印。
同时定义一个Messenger,在服务里面绑定就好。
服务端完成了,现在我们看Activity作为客户端如何传递数据的。
Activity建立一个ServiceConnection来传递数据:
然后直接绑定服务后发送就好
这时我们在控制台上找到对应的进程打印后就会大仙数据接收到了:
我们接收到数据其实还应该继续返还给客户端信息。方法一样,只不过全都调换过来而已。
代码已经上传。项目地址 。
网友评论