基于Clean Architecture的员工/经理/秘书Android应用代码共享咨询
多模块Clean Architecture下的多应用共享实现方案
一、项目结构规划
基于Alexandru Dumbravan的Clean Architecture分层思路,将项目拆分为共享通用模块和三个独立应用模块,确保共享模块无业务耦合,仅提供通用能力:
根项目/ ├─ shared-utils/ # 通用工具类(日期处理、字符串工具、网络状态监听等) ├─ shared-ui/ # 通用UI组件(统一样式按钮、标题栏、加载弹窗等) ├─ employee-app/ # 员工端应用 │ ├─ data/ # 数据层(员工专属接口、本地缓存) │ ├─ domain/ # 领域层(员工业务逻辑、用例) │ └─ presentation/ # 表现层(员工端UI、ViewModel) ├─ manager-app/ # 管理端应用 │ ├─ data/ │ ├─ domain/ │ └─ presentation/ └─ secretary-app/ # 秘书端应用 ├─ data/ ├─ domain/ └─ presentation/
二、模块关联配置
通过Gradle实现应用模块对共享模块的依赖,确保代码复用:
- 在根项目的
settings.gradle中注册所有模块:
include ':shared-utils', ':shared-ui', ':employee-app', ':manager-app', ':secretary-app'
- 在每个应用模块的
build.gradle(Module级别)中添加共享模块依赖:
dependencies { // 依赖通用工具模块 implementation project(':shared-utils') // 依赖通用UI模块 implementation project(':shared-ui') // 其他Clean Architecture相关依赖 implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3' }
三、共享模块示例代码
1. shared-utils 通用工具类
// shared-utils/src/main/java/com/yourcompany/shared/utils/DateUtils.kt object DateUtils { fun formatTimestamp(timestamp: Long): String { val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault()) return sdf.format(Date(timestamp)) } fun isToday(timestamp: Long): Boolean { val todayCalendar = Calendar.getInstance() val targetCalendar = Calendar.getInstance().apply { time = Date(timestamp) } return todayCalendar.get(Calendar.YEAR) == targetCalendar.get(Calendar.YEAR) && todayCalendar.get(Calendar.MONTH) == targetCalendar.get(Calendar.MONTH) && todayCalendar.get(Calendar.DATE) == targetCalendar.get(Calendar.DATE) } }
2. shared-ui 通用UI组件
// shared-ui/src/main/java/com/yourcompany/shared/ui/components/CommonPrimaryButton.kt class CommonPrimaryButton @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : AppCompatButton(context, attrs, defStyleAttr) { init { initStyle() } private fun initStyle() { setBackgroundResource(R.drawable.bg_primary_button) setTextColor(ContextCompat.getColor(context, R.color.white)) textSize = 16f setPadding(32, 16, 32, 16) cornerRadius = 8.dpToPx(context).toFloat() } private fun Int.dpToPx(context: Context): Int { return (this * context.resources.displayMetrics.density).toInt() } }
四、应用模块使用示例
以员工端应用的MainActivity为例,直接调用共享模块的能力:
// employee-app/src/main/java/com/yourcompany/employee/presentation/MainActivity.kt class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 使用shared-utils的日期工具 val currentTime = System.currentTimeMillis() findViewById<TextView>(R.id.tv_current_date).text = DateUtils.formatTimestamp(currentTime) // 使用shared-ui的通用按钮 findViewById<CommonPrimaryButton>(R.id.btn_employee_submit).setOnClickListener { Toast.makeText(this, "提交员工数据", Toast.LENGTH_SHORT).show() } } }
关键注意事项
- 共享模块禁止依赖任何应用模块,仅允许依赖Android核心库或通用第三方库(如OkHttp、Glide的基础依赖)
- 若需共享业务相关的通用逻辑(如统一登录态管理),可新增
shared-domain模块,专注于跨应用的通用领域模型和用例 - 保持共享模块的单一职责:shared-utils只做工具类,shared-ui只做UI组件,避免模块臃肿
内容的提问来源于stack exchange,提问作者Sepidehye Fanavari
相关产品推荐
相关产品推荐

