自定义多选相册,组件化开发
2022-01-20 本文已影响0人
光sail
背景
在我们平常的开发中 ,有很多功能都是写过的。每一个新的项目 ,又从零开始写所有的代码,显得重复劳动,既费时间,又费精力。从老项目中拷贝出来,如果文件很多的话,拷贝过来又要调试,改包名,导入新包名的类,又很繁琐。基于以上原因,我们在开发中需要做到 一处开发,处处使用,即组件化开发。
理想的开发模式应该是整个app通过各个组件合并,再加上app的业务逻辑,组成一个完整的应用。
例子
自定义相册多选图片在很多项目中都是非常常见的控件。
下面从自定义相册多选图片中的拍照获取图片功能为例子,介绍下我是如何进行组件化开发的,当然这只是组件化开发其中的一种方式。
我以单独一个module 开发自定义多选相册功能,开发完成后关联在项目App上进行调用,这样的写有以下好处
- 以module的方式写,当有其他项目需要使用时,打包成带res下的资源文件和清单文件的aar包供项目使用,省去了多个项目使用时,需要拷贝一大堆java文件、 图片等文件和拷贝后调试功能的麻烦。
- 有些同学会说可以发布的github 做成自己的libary ,再在gradle 是使用,这也是一种方法。但是github 在国内的时候有时候不太稳定,而做成aar 使用,就不会存在网络不稳定这个问题了。
组件化开发的注意事项
随着项目的复杂,组件化开发需要注意很多事项,下面就自定义多选相册的拍照功能举个例子
在组件化开发过程中,需要注意的 module 里面的清单文件,声明的四大组件名称,不能使用系统的名称,需要保证四大组件的名称在整个项目的唯一性。我们知道在调用相机进行拍照时android 7.0以上 是不能直接通过URI访问的,需要通过FileProvider 访问,一般非组件化开发,清单文件声明的FileProvide 都是下方代码块
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
由于我们无法保证其他项目里是否使用android.support.v4.content.FileProvider这个系统的provider,所以在组件化开发中,我们就需要保证在我们自己的module中声明的provider的是惟一性。所以我在自定义多选相册这个module 中新建自定义的CameraFilePrivoder,继承系统的FileProvider,然后在清档文件下声明如下,这样就可以保证自定义多选相册module 的provider不会可能和其他项目产生冲突。
<provider
android:name="com.app.camera.CameraFileProvider"
android:authorities="${applicationId}.app.file.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>