天天看點

Android插件化的思考——仿QQ一鍵換膚,思考比實作更重要!Android插件化的思考——仿QQ一鍵換膚,思考比實作更重要!

今天群友希望寫一個關于插件的blog,思來想去,插件也不是很懂,隻是用大緻的思路看看能不能模拟一個,思路還是比較重要的,如果你有興趣的話,也可以加群:555974449,你也可以說出你想看的blog哦,嘿嘿!好的,不多說,我們進入正題: 關于qq的換膚,他們的實作思路我不是很清楚,但是你可以看一下這張換膚的截圖
Android插件化的思考——仿QQ一鍵換膚,思考比實作更重要!Android插件化的思考——仿QQ一鍵換膚,思考比實作更重要!
我們想使用哪個主題就直接下載下傳就好了,這一實作的過程我們大緻的可以猜想: 首選是下載下傳到本地指定檔案夾,然後通過插件加載到我們的apk,最後應用為皮膚,邏輯大緻是這樣的邏輯了,那我們是不是應該動動手啊動動腦? 首選我們建立一個工程好了——pluginsample
Android插件化的思考——仿QQ一鍵換膚,思考比實作更重要!Android插件化的思考——仿QQ一鍵換膚,思考比實作更重要!
其實說起來,這個插件的實作思路,确實是比較的麻煩,思來想去,還是一種辦法比較靠譜,首先,我們刻意去擷取手機上所有的安裝的/未安裝的程式,過濾掉沒用的,留下我們的插件apk,我們的插件apk怎麼去辨識呢?我們可用通過設定shareduserid,然後用實體類把插件名稱和包名儲存下來,有了包名,就比較好說了,我們可用擷取插件的上下文,也就是createpackagecontext,然後就可以做點壞事了,我們可以去剖析我們的r檔案
Android插件化的思考——仿QQ一鍵換膚,思考比實作更重要!Android插件化的思考——仿QQ一鍵換膚,思考比實作更重要!
因為r檔案裡面都是靜态的原因,我們很容易聯想到反射機制,是的,我們可以再一次過濾掉無用的資訊,通過我們的pathclassloader去加載,通路我們的内加載器反射到我們的圖檔id,也就是後面的那段數字,然後,嘿嘿,就可以使用了,是不是思路比較清晰了?這裡要注意的就是圖檔命名統一,這樣就比較号過來,那具體我們應該怎麼做?
我們寫一個spinner,每次切換就直接換膚怎麼樣?ok,每次換的時候就從插件apk裡加載我們的圖檔資源,看起來是比較順暢的邏輯,那我們具體該怎麼做呢?
當然,我這剛應用就一個view,但是實際開發當中可不止,是以步驟一定要明了
這裡就是過濾了一下,通過shareduserid去拿到我們的插件apk了,然後就可以拿到我們的包名和應用名,他傳回給我們一個資料集
我們通過剛才的資料集便可以把我們拿到的資料給直接顯示出來了,這裡其實可以判斷一下size是否為0,如果為0的話也就沒有插件,ok,我們設定adapter和監聽,做到這裡,其實你可以運作一下,雖然我們現在什麼都沒有,我們要做的還有很多
這裡的代碼就比較有意思,一定要仔細看,我們首先拿到選中的item的包名,通過我們的createpackagecontext拿到我們的上下文,通過這兩個我們可用拿到我們的資源id,也就是r清單裡面的id,然後直接設定window的背景,這裡為了好看才設定window的背景,實際上你要設定的是你根布局的背景,那好,我們來看一下如何通過插件的上下文和包名拿到r清單的資源id
這裡我們做了很多事情,首選是拿到我們的類加載器去反射我們的插件,然後通過class去拿我們的資源,這裡注意packagenmae是我們的檔案目錄,他下面的r檔案,$代表類部類的意思,他下面的drawable子節點,然後再一次過濾,過濾之後我們可用周遊一遍拿到我們的id用list儲存起來,也就有了我們選中的時候的設定,好的,到這裡主程式算是編寫完成了,不過要注意的是,記住要添加shareduserid啊,至關重要!!!
我們現在運作也是空的,無意義,我們直接來寫我們的插件吧!
插件的編寫很簡單,我們建立一個pluginapk的工程
Android插件化的思考——仿QQ一鍵換膚,思考比實作更重要!Android插件化的思考——仿QQ一鍵換膚,思考比實作更重要!
工程裡要做的事情就三件

1.添加shareduserid

2.更改name

這就取決于你了,比如我這裡是angelababy的主題,我就把名字改成angelababy

3.把圖檔放在drawable檔案夾下

好的,做完這三部,我們本能的把插件運作一下,運作之後,我們再次啟動主程式,你會看到....
Android插件化的思考——仿QQ一鍵換膚,思考比實作更重要!Android插件化的思考——仿QQ一鍵換膚,思考比實作更重要!
其實我們主程式裡啥也沒有,對吧,但是的卻加載進來了,這就說明我們的插件化算是圓滿實作了,那我們多來點主題看看最終的效果是什麼樣子的?
Android插件化的思考——仿QQ一鍵換膚,思考比實作更重要!Android插件化的思考——仿QQ一鍵換膚,思考比實作更重要!
通過這個思路确實可以加載到圖檔,但是這個邏輯依舊有些不完美,不過最重要的,思考比實作更重要,對吧,後續的也就是一步步的優化了,希望大家和我一起探讨一下! 當上完整的代碼
這裡還有一個實體類哦,具體看demo:

繼續閱讀