在mvvm结构化应用中访问电池寿命信息的正确方法是什么?

时间:2019-01-06 17:46:44

标签: android android-studio mvvm kotlin


我是Android开发的新手。我已经使用WPF(C#)或Tkinter(Python)等各种技术以及Windows Phone移动应用程序开发了许多桌面应用程序。我真的很喜欢MVVM(模型-视图-视图模型)设计模式,因为它很好地将业务逻辑与表示分离开来。
致力于Android开发,我想创建一个简单的应用程序,该应用程序基于MVVM显示电池电量。我能够使数据绑定工作,并将我的viewmodel属性注入到基于XML的视图中。
接下来,我想在模型层中创建一个服务类,以监视电池,并且可以自上而下进行访问以获取当前电池电量。不幸的是,我能够在互联网上找到的所有示例都使用继承了“活动”的类来完成此操作。据我了解,“活动”类是XML文件背后的某种代码,我不想在其中放置业务逻辑。

我用以下代码尝试过:

class BatteryLevelBroadcastReceiver : BroadcastReceiver() {
    var onLevelChanged: (() -> Unit)? = null
    var level: Int? = 0

    override fun onReceive(context: Context?, intent: Intent?) {
        level = intent?.getIntExtra(BatteryManager.EXTRA_LEVEL, 0)
        onLevelChanged?.invoke()
    }
}

class BatteryMonitor : Activity() {
    var batteryLevel: Int? = 0
    private val _batteryReceiver : BatteryLevelBroadcastReceiver = BatteryLevelBroadcastReceiver()

    init {
        _batteryReceiver.onLevelChanged = { batteryLevel = _batteryReceiver.level }
        registerReceiver(test, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
    }

    companion object {
        val instance = BatteryMonitor()
    }
}

我期望单例类BatteryMonitor始终在BatteryMonitor.instance.batteryLevel中提供当前电池电量。而是,该应用程序崩溃并出现以下异常:

E/AndroidRuntime: FATAL EXCEPTION: main
...
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Intent android.content.Context.registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter)' on a null object reference
...

我怀疑我在没有任何显示的情况下使用“活动”是错误的。有没有一种方法可以编写只公开当前电池电量属性的服务类?

感谢您提供任何线索

0 个答案:

没有答案