# 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/)


## 一、 创建`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());
}
}
```