Я совершенно новичок в разработке Android. Я разработал множество настольных приложений, используя различные технологии, такие как WPF (C #) или Tkinter (Python), а также мобильные приложения для Windows Phone. Мне очень нравится шаблон проектирования MVVM (Model-View-View Model), потому что он хорошо отделяет бизнес-логику от представления.
Погружаясь в разработку Android, я хотел создать простое приложение, отображающее уровень заряда батареи на основе MVVM. Я смог заставить работать привязку данных и внедрить свои свойства viewmodel в представление на основе XML.
Затем я хотел создать класс обслуживания на уровне модели, который отслеживает уровень заряда батареи и может быть доступен сверху вниз, чтобы получить текущий уровень заряда батареи. К сожалению, во всех примерах, которые мне удалось найти в Интернете, для этого использовался класс, унаследовавший «Activity». Из того, что я понимаю, классы "Activity" являются своего рода кодом позади 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
...
Я подозреваю, что мое использование "Activity" без какого-либо отображения неверно. Есть ли способ написать класс обслуживания, который просто предоставляет свойство с текущим уровнем заряда батареи?
Спасибо за любые подсказки