我是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
...
我怀疑我在没有任何显示的情况下使用“活动”是错误的。有没有一种方法可以编写只公开当前电池电量属性的服务类?
感谢您提供任何线索