Как правильно получить доступ к информации о времени автономной работы в структурированном приложении mvvm? - PullRequest
0 голосов
/ 06 января 2019


Я совершенно новичок в разработке 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" без какого-либо отображения неверно. Есть ли способ написать класс обслуживания, который просто предоставляет свойство с текущим уровнем заряда батареи?

Спасибо за любые подсказки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...