大家好,我系苍王。
以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。
大家应该期待了很久我更新这个系列的文章了吧,其实我一直都有在更新,只是都是在修复前面的文章讨论群内同学遇到的问题。
正好我找到了一些灵感,和在讨论群内遇到一些问题。
这一节,要介绍的是组件化数据共享。
估计大家面试的时候,都会问到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的问题,可以看这边文章
在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******有同学发现属性弃用的问题。
使用Android N将完全弃用这些属性,所以大家请注意了。
解决的办法,可以选择SettingProvider或者低版本调试。
这一节介绍就到这里,
下一节将会更精彩,敬请期待!!!
群号是316556016,也可以扫码进群。我在这里期待你们的加入!!!