最近无意间看到这篇文章,里面是介绍android多进程的一些东西,于是就想试一试在另一个进程下载图片然后在当前进程显示的功能,这样做主要是为了解决应用运行时内存过大的问题,这里面需要用到的知识有AIDL,Service和Android多进程技术。
首先创建一个Android项目,并在main目录下创建aidl目录,里面主要存放进程间通信用的文件,接下来创建一个aidl文件,里面就定义了一个接口,用于获取另一个进程下载的图片,如下图所示:
因为aidl文件中只支持java基本数据类型和string,List,Map,所以要使用其他的类的话,比如Bitmap,就必须再定义一个aidl文件,并在里面声明这个类,如下图:
处理完这两个文件后,编译一下,系统会生成一个Binder类IImageLoader.Stub,这个类非常重要,它是进程间通信的桥梁,整个Android系统都是靠它连接起来的,这里不过多的深入,有兴趣的一定要去研究下,接下来我们定义一个类继承IImageLoader.Stub,并实现里面的getBitmap方法,getBitmap方法主要做的事就是根据imageUrl下载图片并返回一个Bitmap,这里有很多中方法来下载图片,我用的是一个图片处理框架Picasso来处理,代码如下图:
接下来我们再定义一个会运行在另一个进程的service,里面只实现onBind方法,返回刚才定义的ImageLoaderBinder,如下图:
并在清单文件中定义这个service,这里要用到一个属性process,表示这个service要运行在另一个进程,做完这一步后,我们就可以启动这个service了,并通过ImageLoaderBinder获取这个servie进程下载的图片了,启动服务需要用bindservice()方法,最后的效果图如下:
源码地址https://github.com/PengJunJun/MultiprocessTest。