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

Clean架构下Data层能否包含Android框架对象与逻辑?

问题解答

当然可以把Android框架逻辑放在Presentation层之外,你的设计思路本身就符合Clean Architecture的核心原则,下面是具体的实现方案和注意点:

1. 分层结构确认

  • Domain层:保留AlarmScheduler接口,这层完全独立于Android框架,只定义业务需要的行为,不涉及任何具体实现细节。
    // Domain层 - AlarmScheduler.kt
    interface AlarmScheduler {
        fun scheduleWeeklyCheck()
    }
    
  • Data层:实现AndroidAlarmScheduler类,这里可以安全地依赖Android的Context、AlarmManager等框架类,因为Data层的职责就是对接外部系统(包括平台API、数据库、网络等)。
    // Data层 - AndroidAlarmScheduler.kt
    class AndroidAlarmScheduler(private val context: Context) : AlarmScheduler {
        override fun scheduleWeeklyCheck() {
            val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
            // 编写使用AlarmManager设置一周后检测的逻辑
            val intent = Intent(context, WeeklyCheckReceiver::class.java)
            val pendingIntent = PendingIntent.getBroadcast(
                context,
                0,
                intent,
                PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
            )
            val triggerTime = System.currentTimeMillis() + 7 * 24 * 60 * 60 * 1000
            alarmManager.setExactAndAllowWhileIdle(
                AlarmManager.RTC_WAKEUP,
                triggerTime,
                pendingIntent
            )
        }
    }
    

2. 依赖注入解耦

为了避免Presentation层直接依赖Data层的具体实现,需要通过依赖注入来提供AlarmScheduler实例:

  • 在Application类或者DI容器中,把AndroidAlarmScheduler绑定到AlarmScheduler接口。
  • Presentation层的Activity只需要依赖Domain层的AlarmScheduler接口,不需要知道具体是Android平台的实现。
    // Presentation层 - MainActivity.kt
    class MainActivity : AppCompatActivity() {
        // 通过DI注入,比如Hilt、Dagger或手动注入
        private lateinit var alarmScheduler: AlarmScheduler
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            // 按钮点击触发调度
            btn_schedule.setOnClickListener {
                alarmScheduler.scheduleWeeklyCheck()
            }
        }
    }
    

3. 注意事项

  • Data层的Android依赖类(如Context)要通过构造函数传入,不要在类内部直接获取,这样方便单元测试(测试时可传入Mock的Context)。
  • 测试AndroidAlarmScheduler时,可使用AndroidX Test库的ApplicationProvider获取测试Context,或用Mockito等框架模拟AlarmManager。

内容的提问来源于stack exchange,提问作者RubyFlash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:22:39