[Android组件化]组件化数据分享

你们好,我系苍王。
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设置

先将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,也能够扫码进群。我在这里期待大家的加入!!!

相关文章
相关标签/搜索