[Android元件化]元件化資料分享

Cang_Wang發表於2017-05-02

大家好,我係蒼王。

以下是我這個系列的相關文章,有興趣可以參考一下,可以給個喜歡或者關注我的文章。

[Android]如何做一個崩潰率少於千分之三噶應用app--章節列表


大家應該期待了很久我更新這個系列的文章了吧,其實我一直都有在更新,只是都是在修復前面的文章討論群內同學遇到的問題。

正好我找到了一些靈感,和在討論群內遇到一些問題。

這一節,要介紹的是元件化資料共享。

估計大家面試的時候,都會問到android儲存資料的方式是什麼?

大家估計很快就能回答出SharePreference,SQL,FILE IO,ContentProvider,以及網路儲存。

我以前Gradle元件化的文章介紹,每個模組其實是可以分模組做成一個application,利於開發除錯的。

那麼如果將登入模組獨立成app執行,然後其他商場購物也做成app,支付模組也獨立成app,登入模組持有了使用者資料,但是其他模組需要訪問這個登入的資料,我們需要怎麼做呢?

這裡真的需要大家認真思考一下,獨立app通訊,程式通訊,程式內通訊其實是有區別的。


為何我之前沒考慮到這個問題呢?

因為公司已經使用small外掛化,而其使用者登入這樣的模組,其並木有細分出module,而是直接使用宿主的module的登入和支付的功能。就算以後登入和支付模組分成為功能module,如果使用外掛化後,模組是可以做到按需載入的,只需要將登入模組載入到宿主做出登入,就可以通過base module的介面,獲取登入使用者的資訊了。這也是元件化開發和外掛化開發的差別,外掛模組可以執行時插入,而元件化除錯時獲取資訊是有原生限制的。



當然這裡可以提供給大家幾種思路

1.最簡單是使用ContentProvider獲取SQL資料庫/或者sharePreference的資料,具體還是要看你自身app儲存資料的封裝

2.你可以將使用者資料儲存在sharePreference,只是這裡需要一些技巧

3.當然你還可以使用跨app的aidl

4.因為類似使用者資訊這樣的算是基本資訊,其應該儲存到base module裡面讓大家都可以獲取。



看到這些思路,大家覺得哪種比較簡易,比較適合呢?

很明顯是資料設計的時候,可以實現4這種方式,但是專案設計架構的初期,並不一定會意識到這樣的問題,或者出於某些原因,一定要將一些重要資訊儲存到相應的module內,而只讓其他module通過介面的方式獲取。這時候,我們只能考慮如何跨app獲取資訊這條路,就是1,2,3的提議。

之前介紹的Gradle元件化的文章的時候,寫到是可以使用區分debug和release資料夾來做到debug的時候製造application而release的時候切換為lib的,然後通過這個方法統一在base module裡面做出獲取資訊的介面。


這裡我們先以簡單的SharePreference為例,

我們以Gank這個工程作為例子,用news和settings兩個模組作為app研發。

[Android元件化]元件化資料分享

這裡遇到的一些module轉applicaiton的問題,可以看Gradle元件化優化這邊文章

在common_config中新增兩個屬性。

[Android元件化]元件化資料分享


Setting module設定

先將Setting的module轉化為application

[Android元件化]元件化資料分享

然後增加debug的配置

[Android元件化]元件化資料分享

然後建立相應的debug目錄和AndroidManifest.xml

[Android元件化]元件化資料分享

AndroidManifest需要新增入口,需要注意的是,需要新增相應的主題Theme

[Android元件化]元件化資料分享

這裡面我封裝好了一個ListDataSave的檔案,用SharePreference來儲存List資料

這裡面需要巧妙的運用一下BuildConfig的屬性來設定你使用SharePreference的狀態

[Android元件化]元件化資料分享

通常狀態下,我們是不希望其他app可以讀取到我們的app內的資料的,所以需要設定MODE_PRIVATE的屬性。

但是我們需要其他App可以使用我們資料,最好設定其他app可讀的屬性MODE_WORLD_READABLE的屬性。

[Android元件化]元件化資料分享

setting module是這樣去申請儲存設定。

這是設定介面

[Android元件化]元件化資料分享


News module設定

gradle裡面的配置和setting module類似就不重新介紹了

然後工程架構是這樣的,因為一開始用的是Fragment,這裡需要建立了NewsActivity作為app執行的入口

[Android元件化]元件化資料分享

在建立的oncreate的時候使用getDataFromSF的方法

[Android元件化]元件化資料分享

然後這裡需要獲取setting module裡面的資料,並寫入到news裡面

[Android元件化]元件化資料分享

這裡值得注意的,Android提供了createPackageContext的來獲取其他app的context物件。、

[Android元件化]元件化資料分享

然後我們檢視log可以發現,其能成功獲取到setting module裡面的資料

[Android元件化]元件化資料分享

這是News app的顯示。

[Android元件化]元件化資料分享

這裡需要提醒一下,如果使用資料獲取方式,只是使用ContentProvider的方式來給介面給外部獲取。其方式並實現並不難,因為ContextProvider一開始就是針對跨APP的,而Android並不推薦使用SharePreference,你看MODE_WORLD_READABLE已經被廢棄就知道了。

[Android元件化]元件化資料分享

關於資料庫GreenDao等嵌入,我也會在之後的章節,給大家介紹,請大家耐心期待。

當然啦,這裡還是更加推薦在架構的初衷的時候,可以考慮到公共模組的放置的位置的考慮,將base module再拆分獨立module,讓其他基礎的module(登入,支付,通訊IM等),考慮作為基礎模組劃分。



****2017.5.2******

有同學發現屬性棄用的問題。java.lang.SecurityException: MODE_WORLD_READABLE no longer supported

使用Android N將完全棄用這些屬性,所以大家請注意了。

[Android元件化]元件化資料分享

解決的辦法,可以選擇SettingProvider或者低版本除錯。


這一節介紹就到這裡,

下一節將會更精彩,敬請期待!!!

群號是316556016,也可以掃碼進群。我在這裡期待你們的加入!!!

[Android元件化]元件化資料分享

相關文章