Я новичок в Kotlin, и это кажется потрясающим! Хотя сегодня я пытался сделать что-то, что на Java было очень просто, но я полностью застрял.
Я использую широковещательный приемник, чтобы определить, когда устройство подключено / отключено от источника питания. И все, что мне нужно, это обновить свой интерфейс.
Вот мой класс BroadcastReceiver
, и он работает нормально.
class PlugInReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val action = intent.action if (action == Intent.ACTION_POWER_CONNECTED) { // Do stuff when power connected } else if (action == Intent.ACTION_POWER_DISCONNECTED) { // Do more stuff when power disconnected } } }
Теперь в моей MainActivity
(но где-то еще, позже), я хочу обновить свой пользовательский интерфейс, когда намерение запущено, например, в функции ниже, цвет фона меняется.
private fun updateBackgroundColor( newBgColorId: Int = R.color.colorAccent){ val mainLayout = findViewById<View>(R.id.mainLayout) val colorFade = ObjectAnimator.ofObject( mainLayout, "backgroundColor", ArgbEvaluator(), oldBgColor, newBgColor) colorFade.start() }
Как я могу вызвать функцию в MainActivity или обновить свой интерфейс, когда
BroadcastReceiver
запускает событие?
Я смотрел на наличие статической переменной где-то, сохраняя результат BroadcastReciever, а затем наблюдаемый в моем классе пользовательского интерфейса, соответственно наблюдая и вызывая соответствующую функцию. Хотя после того, как Googling, как это сделать, похоже, что это не очень хороший подход в Котлине.
Считал попытку запустить BroadcastReciever в потоке пользовательского интерфейса, но это звучит как ужасная идея.
Пробовал смешивать реализацию Java с моим классом Kotlin, но не смог заставить ее работать.
Разочарочно я нашел несколько очень похожих вопросов о SO. Однако их реализация, похоже, использует специфические для Java функции:
Я уверен, что это тривиальный вопрос для большинства разработчиков Android, но я потерян! Дайте мне знать, если вам нужны подробности. Большое спасибо заранее!
Метод onReceive (…) работает в основном потоке. Вы можете зарегистрировать свою активность в onStart () и отменить регистрацию в onStop (), что гарантирует, что ваш пользовательский интерфейс присутствует при получении события.