You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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实现应用模块对共享模块的依赖,确保代码复用:

  1. 在根项目的settings.gradle中注册所有模块:
include ':shared-utils', ':shared-ui', ':employee-app', ':manager-app', ':secretary-app'
  1. 在每个应用模块的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 12:45:17