Files
BirdsProject/README.md
2026-10-09 10:51:39 +08:00

259 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Kotlin MVP Project
一个使用 Kotlin 编写的 Android MVP 基础模板,提供可直接复用的 MVP 分层、网络请求、ViewBinding、动态权限、通用弹窗及常见页面组件。
该项目适合用于:
- 快速创建采用 MVP 架构的 Android 项目
- 学习 Presenter、View、Model 之间的职责划分
- 作为业务项目的基础工程继续扩展
- 查看 RecyclerView、ConstraintLayout、日期选择器等组件示例
## 项目特点
- 使用 Kotlin 开发,保留少量 Java Adapter 示例
- 使用 MVP 分离界面、业务逻辑和数据访问
- 使用 ViewBinding 访问布局控件
- 封装 Activity、Fragment 和 Presenter 基类
- Retrofit + OkHttp + Gson 网络请求基础封装
- Token 保存及统一网络配置
- 动态权限申请与永久拒绝处理
- 通用 Loading、确认和输入弹窗
- 支持日期、时间及日期时间选择
- 包含 RecyclerView 和 ConstraintLayout 示例页面
- 使用 Version Catalog 集中管理依赖版本
## 技术栈
| 技术 | 用途 |
| --- | --- |
| Kotlin | 主要开发语言 |
| MVP | 页面架构与职责分离 |
| ViewBinding | 类型安全地访问 View |
| AndroidX / Material Components | Android 基础组件与 UI |
| ConstraintLayout | 复杂页面布局 |
| ViewPager2 | 首页分页 |
| Retrofit / OkHttp | 网络请求 |
| Gson | JSON 转换 |
| RecyclerView / BaseRecyclerViewAdapterHelper | 列表展示 |
| ImmersionBar | 状态栏和导航栏适配 |
| Luban | 图片压缩 |
## MVP 结构
项目中的一个标准业务模块通常由以下部分组成:
```text
业务页面 Activity / Fragment
│ 实现 View 接口
▼
Contract(定义 View 与 Presenter 能力)
│
▼
Presenter(业务调度和结果处理)
│
▼
Impl / Model(网络请求或数据访问)
```
各层职责:
- **View**:展示数据、处理用户操作,不直接编写数据访问逻辑。
- **Presenter**:接收 View 事件,调用 Model,并将结果交回 View。
- **Model / Impl**:负责接口请求、本地数据或其他数据来源。
- **Contract**:集中定义各层之间的接口,明确模块边界。
基础接口位于 `app/src/main/java/com/example/kotmvpproject/base`:
- `IView`:Loading、消息和错误展示等通用 View 能力
- `IPresenter`:绑定 View 和生命周期方法
- `BasePresenter`:持有并释放 View,降低内存泄漏风险
- `BaseActivity` / `BaseFragment`:集成 ViewBinding 和 Presenter
- `BaseActivityNoPresenter` / `BaseFragmentNoPresenter`:用于不需要 Presenter 的简单页面
## 目录结构
```text
KotMvpProject/
├── app/src/main/java/com/example/kotmvpproject/
│ ├── base/ # MVP、Activity、Fragment 基类
│ ├── network/ # Retrofit、OkHttp、接口和 Token 管理
│ ├── login/ # 登录模块 MVP 示例
│ ├── main/ # 主页面及 Fragment 模块
│ ├── mine/ # 个人中心及组件入口
│ ├── component/ # 可复用业务组件
│ ├── dialog/ # 通用弹窗
│ ├── demo/ # RecyclerView、ConstraintLayout 示例
│ ├── util/ # 通用工具
│ └── utils/ # 应用升级等工具
├── app/src/main/res/ # 布局、图片、颜色和字符串资源
├── gradle/libs.versions.toml # 依赖版本管理
└── app/build.gradle # Android 模块配置
```
## 环境要求
- Android Studio(建议使用当前稳定版本)
- JDK 17
- Android SDK 36
- 最低支持 Android 7.0(API 24)
## 快速开始
1. 克隆仓库:
```bash
git clone https://gitee.com/fengjingqi/kotlin-mvp-project.git
```
2. 使用 Android Studio 打开项目根目录。
3. 等待 Gradle 同步完成。
4. 修改 `NetworkConfig.kt` 中的服务端地址和网络配置。
5. 连接设备或启动模拟器,运行 `app` 模块。
也可以在命令行编译:
```bash
./gradlew assembleDebug
```
Windows PowerShell:
```powershell
.\gradlew.bat assembleDebug
```
## 创建一个新的 MVP 模块
建议每个业务模块至少包含 `Contract`、`Presenter`、`Impl` 和页面类。
### 1. 定义 Contract
```kotlin
interface ExampleContract {
interface View : IView {
fun showContent(content: String)
}
interface Presenter : IPresenter<View> {
fun loadContent()
}
}
```
### 2. 编写数据实现
```kotlin
class ExampleImpl {
fun loadContent(): String = "Hello MVP"
}
```
实际业务中可在这一层调用 Retrofit 接口或本地数据库。
### 3. 编写 Presenter
```kotlin
class ExamplePresenter(
private val model: ExampleImpl
) : BasePresenter<ExampleContract.View>(), ExampleContract.Presenter {
override fun loadContent() {
view?.showLoading()
val content = model.loadContent()
view?.hideLoading()
view?.showContent(content)
}
}
```
### 4. 页面绑定 Presenter
```kotlin
class ExampleActivity :
BaseActivity<ActivityExampleBinding, ExamplePresenter>(),
ExampleContract.View {
override fun createBinding(inflater: LayoutInflater) =
ActivityExampleBinding.inflate(inflater)
override fun createPresenter() = ExamplePresenter(ExampleImpl())
override fun initView(savedInstanceState: Bundle?) {
binding.loadButton.setOnClickListener {
presenter?.loadContent()
}
}
override fun showContent(content: String) {
binding.contentTextView.text = content
}
override fun showError(message: String) {
showMessage(message)
}
}
```
最后在 `AndroidManifest.xml` 注册 Activity,并创建对应布局即可。
## 已有示例
- **登录模块**:完整的 Activity MVP 结构和 Token 保存流程
- **首页模块**:ViewPager2、底部导航及多个 Fragment MVP 模块
- **个人中心**:网络数据加载、权限、弹窗、选择器和组件入口
- **RecyclerView 示例**:列表、Item 点击和子控件点击
- **ConstraintLayout 示例**:Guideline、Barrier、Group、Chain、宽高比及基线约束
- **应用升级**:版本检查、APK 下载和安装处理
运行应用后,可从“我的”页面进入个人中心,再打开各个组件示例。
## 网络配置
网络相关代码位于 `network` 目录。接入实际服务端时重点检查:
- `NetworkConfig.kt`:Base URL、超时时间等配置
- `ApiService.kt`:Retrofit 接口定义
- `ApiClient.kt`:Retrofit 客户端
- `NetworkManager.kt`:请求调用与结果处理
- `TokenManager.kt`:登录 Token 的保存和读取
生产项目中不要将密码、私钥、正式环境 Token 等敏感数据提交到仓库。
## 后续扩展建议
- 使用 Kotlin Coroutines 替换或补充当前异步请求方案
- 引入依赖注入,统一创建 Presenter、Repository 和网络对象
- 增加 Repository 层,隔离远程数据与本地数据
- 为 Presenter 和数据层补充单元测试
- 将通用 UI、网络和工具代码拆分为独立 Library Module
- 增加多环境配置及签名配置管理
## License
当前仓库暂未声明开源许可证。如需公开复用或分发,建议根据实际用途补充 LICENSE 文件。
别名: chengkong
创建日期: 2026年5月6日
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: C=86, ST=ShanDong, L=RiZhao, O=ChengKong, OU=ChengKong, CN=ChengKong
发布者: C=86, ST=ShanDong, L=RiZhao, O=ChengKong, OU=ChengKong, CN=ChengKong
序列号: 1
生效时间: Wed May 06 17:08:58 CST 2026, 失效时间: Sun Apr 30 17:08:58 CST 2051
证书指纹:
SHA1: B1:3A:DB:EA:42:E7:02:F8:FA:0A:71:A4:33:CD:42:CB:8A:6A:59:8E
SHA256: FB:4F:3C:AA:03:C3:30:2A:14:21:C0:66:1F:78:72:70:35:2C:BB:3A:E9:81:68:44:5E:AA:3B:33:D1:B8:FE:99
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 1
Android_JUMHABI 32c97984f1089eb5e85721ee39261650