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

大家好,我系苍王。

以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。

[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,也可以扫码进群。我在这里期待你们的加入!!!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值