# Template-project **Repository Path**: liubaoxinggo/template-project ## Basic Information - **Project Name**: Template-project - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-12-23 - **Last Updated**: 2021-12-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: Android ## README # 学习 *AucFrame*架构 引用大神`布兰柯基`的博客上的图片等,如果侵权,请提示本人,联系邮箱`liubaoxinggo@qq.com` 参考学习大神`布兰柯基`的博客[https://blankj.com/categories/Android/AucFrame/](https://blankj.com/categories/Android/AucFrame/)
![工程结构](./zimage/auc_frame_general.png)
![项目结构](./zimage/project_struct.png)
## 一、 创建`buildSrc`统一管理依赖库 - 1. 在根目录下创建`buildSrc`文件夹 - 2.在`buildSrc`文件下创建`build.gradle` - 3.同步工程,会自动在`buildSrc`文件夹下生成一些文件; - 4.在`buildSrc`文件夹下创建`src\main\groovy`文件夹和`src\main\java`; - 5.在`src\main\groovy`文件夹下创建`Config.groovy`,同步工程,在使用的地方引入,鼠标点击可以跳转,但是鼠标在引用处停靠时没有提示; - 6.在`src\main\java`文件夹下创建`Configs.java` `Deps.java`和`V.java` ,同步工程,在使用的地方引入,鼠标在引用处停靠时有提示; 注意:先同步工程,再引入使用
PS: **个人推荐使用创建`.java`的方式** ## 二、创建`lib` - 1.根目录下创建`lib`文件夹; - 2.根目录先创建一个`Android Library` 类型的 `base` module,将其中的`androidTest` 以及 `test` 测试目录删除; - 3.将`base`移入`lib`文件夹下; - 4.修改 `setting.gradle` 文件中的 `':base'` 为 `':lib:base'`,最后点击 Gradle 的同步即可; - 5.重复`2/3/4`步骤,创建 `common` module; - 6.`base` 和 `common` 的 `build.gralde` 简直一毛一样,这样我们把他们都抽出去,在项目根目录创建 `buildLib.gradle` 文件,代表所有 `lib` 类型的模块都可以使用它; ## 三、创建`feature`,即具体的业务`module` - 1.根目录下创建`feature`文件夹; - 2.在`feature`文件夹文件夹下创建`feature0`文件夹; - 3.根目录先创建一个`Android Library` 类型的 `export` module,注意包名`com.gsafety.feature0.export`,将其中的`androidTest` 以及 `test` 测试目录删除; - 4.将`export`移入`feature0`文件夹下; - 5.修改 `setting.gradle` 文件中的 `:export` 为 `':feature:feature0:export'`,最后点击 Gradle 的同步即可; - 6.重复`2/3/4/5`步骤,创建 `pkg` module,或直接在`feature0`文件夹下创建`pkg` module; - 7.`export`和 `pkg`的 `build.gralde` 也统一引入 `buildLib.gradle`,只是各自的依赖不同; - 8.在`feature0`文件夹下创建一个`Phone & Tablet` 类型的`app` module; - 9.抽离`app` module下的`build.gralde`,类似于`lib`下的,在项目根目录创建 `buildApp.gradle` 文件; ## 四、`BusUtils` 使用,类似于 `EventBus`,高效的模块内通讯工具 - 1.在项目根目录的 `build.gradle` 中添加 `bus` 插件: ``` buildscript { dependencies { ... classpath 'com.blankj:bus-gradle-plugin:latest_version' } } ``` - 2.在 `application`的`build.gralde` 模块中使用该插件: ``` apply plugin: "com.blankj.bus" ``` - 3.添加 `AndroidUtilCode` 依赖: ``` api 'com.blankj:utilcodex:latest_version' ``` - 4.具体使用参考 `bus` module; ## 五、`ApiUtils` 两个业务模块键的通信,类似 `SPI` [传送门](https://github.com/Blankj/AndroidUtilCode/tree/master/plugin/api-gradle-plugin) - PS: **个人认为还是使用[ARouter](https://github.com/alibaba/ARouter)比较好,真正做到了各个业务模块间的解耦** - 1.在项目根目录的 `build.gradle` 中添加 `bus` 插件: ``` buildscript { dependencies { ... classpath 'com.blankj:api-gradle-plugin:latest_version' } } ``` - 2.在 `application`的`build.gralde` 模块中使用该插件: ``` apply plugin: "com.blankj.api" ``` - 3.添加 `AndroidUtilCode` 依赖: ``` api 'com.blankj:utilcodex:latest_version' ``` - 4.具体使用参考`main`下的`export` `pkg` 及 `launcher` ## 六、`ServiceLoader` 使用,以语音输入能力为例 - 1.定义接口 `com.gsafety.common.ability.voice.IVoiceInputAbility`; - 2.在`resources`资源目录下创建`META-INF/services`文件夹; - 3.在`services`文件夹中创建文件,以接口全名命名`com.gsafety.common.ability.voice.IVoiceInputAbility`; - 4.创建接口的实现类`com.gsafety.voiceinput.VoiceInputAbility`; - 5.在文件`com.gsafety.common.ability.voice.IVoiceInputAbility`中写入实现的类`com.gsafety.voiceinput.VoiceInputAbility`; - 6.使用`ServiceLoader`加载,如:`com.gsafety.common.ability.voice.VoiceInputAbilityFactory`实现; ``` ServiceLoader loader = ServiceLoader.load(IVoiceInputAbility.class); Iterator mIterator = loader.iterator(); IVoiceInputAbility voiceInputAbility; if(mIterator != null && mIterator.hasNext()){ voiceInputAbility = mIterator.next(); } if(voiceInputAbility != null){ voiceInputAbility.openVoice(this, new IVoiceInputCallback() { @Override public void onTalkEnd(String text) { } }); } ``` ## 七、注解 `AutoService` 使用,以语音输入能力为例 - 1.加入依赖; ``` implementation 'com.google.auto.service:auto-service:1.0.1' annotationProcessor 'com.google.auto.service:auto-service:1.0.1' ``` - 2.定义接口 `com.gsafety.common.ability.voice.IVoiceInputAbility`; - 3.创建接口的实现类`com.gsafety.test.VoiceInputAbility`,并使用注解`AutoService`; ``` @AutoService(IVoiceInputAbility.class) public class VoiceInputAbility implements IVoiceInputAbility { @Override public void openVoice(Context activity, IVoiceInputCallback callback) { LogUtils.i("我是另一个实现类--使用注解AutoService"); callback.onTalkEnd("哈哈哈,我来自"+this.getClass().getName()); } } ```