你們好,我係蒼王。
java
如下是我這個系列的相關文章,有興趣能夠參考一下,能夠給個喜歡或者關注個人文章。android
[Android]如何作一個崩潰率少於千分之三噶應用app--章節列表面試
你們應該期待了好久我更新這個系列的文章了吧,其實我一直都有在更新,只是都是在修復前面的文章討論羣內同窗遇到的問題。數據庫
正好我找到了一些靈感,和在討論羣內遇到一些問題。網絡
這一節,要介紹的是組件化數據共享。架構
估計你們面試的時候,都會問到android存儲數據的方式是什麼?app
你們估計很快就能回答出SharePreference,SQL,FILE IO,ContentProvider,以及網絡存儲。ide
我之前Gradle組件化的文章介紹,每一個模塊實際上是能夠分模塊作成一個application,利於開發調試的。組件化
那麼若是將登陸模塊獨立成app運行,而後其餘商場購物也作成app,支付模塊也獨立成app,登陸模塊持有了用戶資料,可是其餘模塊須要訪問這個登陸的資料,咱們須要怎麼作呢?gradle
這裏真的須要你們認真思考一下,獨立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研發。
這裏遇到的一些module轉applicaiton的問題,能夠看Gradle組件化優化這邊文章
在common_config中添加兩個屬性。
先將Setting的module轉化爲application
而後增長debug的配置
而後創建相應的debug目錄和AndroidManifest.xml
AndroidManifest須要添加入口,須要注意的是,須要添加相應的主題Theme
這裏面我封裝好了一個ListDataSave的文件,用SharePreference來保存List數據
這裏面須要巧妙的運用一下BuildConfig的屬性來設置你使用SharePreference的狀態
一般狀態下,咱們是不但願其餘app能夠讀取到咱們的app內的數據的,因此須要設置MODE_PRIVATE的屬性。
可是咱們須要其餘App可使用咱們數據,最好設置其餘app可讀的屬性MODE_WORLD_READABLE的屬性。
setting module是這樣去申請保存設置。
這是設置界面
gradle裏面的配置和setting module相似就不從新介紹了
而後工程架構是這樣的,由於一開始用的是Fragment,這裏須要建立了NewsActivity做爲app運行的入口
在建立的oncreate的時候使用getDataFromSF的方法
而後這裏須要獲取setting module裏面的數據,並寫入到news裏面
這裏值得注意的,Android提供了createPackageContext的來獲取其餘app的context對象。、
而後咱們查看log能夠發現,其能成功獲取到setting module裏面的數據
這是News app的顯示。
這裏須要提醒一下,若是使用數據獲取方式,只是使用ContentProvider的方式來給接口給外部獲取。其方式並實現並不難,由於ContextProvider一開始就是針對跨APP的,而Android並不推薦使用SharePreference,你看MODE_WORLD_READABLE已經被廢棄就知道了。
關於數據庫GreenDao等嵌入,我也會在以後的章節,給你們介紹,請你們耐心期待。
固然啦,這裏仍是更加推薦在架構的初衷的時候,能夠考慮到公共模塊的放置的位置的考慮,將base module再拆分獨立module,讓其餘基礎的module(登陸,支付,通訊IM等),考慮做爲基礎模塊劃分。
****2017.5.2******
有同窗發現屬性棄用的問題。java.lang.SecurityException: MODE_WORLD_READABLE no longer supported
使用Android N將徹底棄用這些屬性,因此你們請注意了。
解決的辦法,能夠選擇SettingProvider或者低版本調試。
這一節介紹就到這裏,
下一節將會更精彩,敬請期待!!!
羣號是316556016,也能夠掃碼進羣。我在這裏期待大家的加入!!!