大家好,我係蒼王。
以下是我這個系列的相關文章,有興趣可以參考一下,可以給個喜歡或者關注我的文章。
[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研發。
這裡遇到的一些module轉applicaiton的問題,可以看Gradle元件化優化這邊文章
在common_config中新增兩個屬性。
Setting module設定
先將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是這樣去申請儲存設定。
這是設定介面
News 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,也可以掃碼進群。我在這裡期待你們的加入!!!