? ? 最近無意間看到這篇文章,里面是介紹android多進(jìn)程的一些東西,于是就想試一試在另一個(gè)進(jìn)程下載圖片然后在當(dāng)前進(jìn)程顯示的功能,這樣做主要是為了解決應(yīng)用運(yùn)行時(shí)內(nèi)存過大的問題,這里面需要用到的知識(shí)有AIDL,Service和Android多進(jìn)程技術(shù)。
? ? 首先創(chuàng)建一個(gè)Android項(xiàng)目,并在main目錄下創(chuàng)建aidl目錄,里面主要存放進(jìn)程間通信用的文件,接下來創(chuàng)建一個(gè)aidl文件,里面就定義了一個(gè)接口,用于獲取另一個(gè)進(jìn)程下載的圖片,如下圖所示:

因?yàn)閍idl文件中只支持java基本數(shù)據(jù)類型和string,List,Map,所以要使用其他的類的話,比如Bitmap,就必須再定義一個(gè)aidl文件,并在里面聲明這個(gè)類,如下圖:

處理完這兩個(gè)文件后,編譯一下,系統(tǒng)會(huì)生成一個(gè)Binder類IImageLoader.Stub,這個(gè)類非常重要,它是進(jìn)程間通信的橋梁,整個(gè)Android系統(tǒng)都是靠它連接起來的,這里不過多的深入,有興趣的一定要去研究下,接下來我們定義一個(gè)類繼承IImageLoader.Stub,并實(shí)現(xiàn)里面的getBitmap方法,getBitmap方法主要做的事就是根據(jù)imageUrl下載圖片并返回一個(gè)Bitmap,這里有很多中方法來下載圖片,我用的是一個(gè)圖片處理框架Picasso來處理,代碼如下圖:

接下來我們?cè)俣x一個(gè)會(huì)運(yùn)行在另一個(gè)進(jìn)程的service,里面只實(shí)現(xiàn)onBind方法,返回剛才定義的ImageLoaderBinder,如下圖:

并在清單文件中定義這個(gè)service,這里要用到一個(gè)屬性process,表示這個(gè)service要運(yùn)行在另一個(gè)進(jìn)程,做完這一步后,我們就可以啟動(dòng)這個(gè)service了,并通過ImageLoaderBinder獲取這個(gè)servie進(jìn)程下載的圖片了,啟動(dòng)服務(wù)需要用bindservice()方法,最后的效果圖如下:

源碼地址https://github.com/PengJunJun/MultiprocessTest。