android - Kotlin:调用函数从 BroadcastReceiver onReceive 更新 UI

标签 android broadcastreceiver kotlin

我是 Kotlin 的新手,它看起来很棒!虽然今天,我一直在尝试做一些在 Java 中非常简单的事情,但我完全被困住了。

我正在使用广播接收器来确定设备何时连接/断开电源。我需要做的就是相应地更新我的 UI。


我的代码

这是我的 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 中(但在其他地方,稍后),我想在 intent 被触发时更新我的​​ UI,例如在下面的函数中,背景颜色发生变化。

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()
}

问题

How can I call a function on the MainActivity, or update my UI when the BroadcastReceiver fires an event?


到目前为止我尝试了什么

  • 我考虑在某处设置一个静态变量,存储 BroadcastReciever 的结果,然后在我的 UI 类中创建一个可观察对象,相应地观察和调用适当的函数。尽管在谷歌上搜索了如何执行此操作后,看起来这在 Kotlin 中并不是一个真正的好方法。

  • 考虑尝试在 UI 线程上运行 BroadcastReciever,但这听起来很糟糕。

  • 尝试将 Java 实现与我的 Kotlin 类混合使用,但无法正常工作。

令人沮丧的是,我在 SO 上发现了几个非常相似的问题。然而,它们的实现似乎都使用了 Java 特定的功能:


我敢肯定这对大多数 Android 开发人员来说是一个微不足道的问题,但我迷路了!如果您需要更多详细信息,请告诉我。非常感谢!

最佳答案

共享信息以在 Kotlin 中注册 BroadcastReceiver

第 1 步. 在 MainActivity.kt 中创建 BroadcastReceiver

private val mPlugInReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        when (intent?.action) {
            Intent.ACTION_POWER_CONNECTED -> {
                //update your main background color
                updateBackgroundColor()
            }
            Intent.ACTION_POWER_DISCONNECTED -> {
                //update your main background color
                updateBackgroundColor()
            }
        }
    }
}

第 2 步。创建 IntentFilter

private fun getIntentFilter(): IntentFilter {
    val iFilter = IntentFilter()
    iFilter.addAction(Intent.ACTION_POWER_CONNECTED)
    iFilter.addAction(Intent.ACTION_POWER_DISCONNECTED)
    return iFilter
}

步骤 3. 在 onStart() 注册接收者

override fun onStart() {
    super.onStart()
    registerReceiver(mPlugInReceiver, getIntentFilter())
}

步骤 4. 在 onStop() 取消注册接收器

override fun onStop() {
    super.onStop()
    unregisterReceiver(mPlugInReceiver)
}

如果您有自定义 BroadcastReceiver,您可以使用 LocalBroadcastManager 注册并创建您的本地 IntentFilter

private val mLocalBroadcastReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        when (intent?.action) {
            AnyService.UPDATE_ANY -> {

            }
        }
    }
}

private fun getLocalIntentFilter(): IntentFilter {
    val iFilter = IntentFilter()
    iFilter.addAction(AnyService.UPDATE_ANY)
    return iFilter
}

注册本地接收者 LocalBroadcastManager.getInstance(applicationContext).registerReceiver(mLocalBroadcastReceiver, getLocalIntentFilter())

注销本地接收器LocalBroadcastManager.getInstance(applicationContext).unregisterReceiver(mLocalBroadcastReceiver)

关于android - Kotlin:调用函数从 BroadcastReceiver onReceive 更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47742474/

相关文章:

android - EditText : Can't type in content, 当 EditText 有时有焦点时

java - 声明字符串数组导致问题

android - BroadcastReceiver 没有被 AlarmManager 触发

kotlin - 为什么 Gradle 强制使用 Kotlin 版本,以及如何修复它?

Kotlin 从委托(delegate)访问属性名称

annotations - 如何在注解 Kotlin 中使用类

android - 使用 IDEA 12.0 制作非常缓慢

android - 使用改造缓存特定响应

java - 使用广播接收器接收长进程短信的最佳方式

android - 在 BroadcastReceiver 中启动 Activity