简体   繁体   中英

Kotlin: How to read MutableLiveData in Background

I created MutableLiveData<Int> in order to keep tracking step count.

  companion object {
        var todayTotalStepCount: MutableLiveData<Int>? = MutableLiveData()
    }

And I use ForegroundService to make SensorManager keep working in background or even when app is off.

In Service() class, I use NotificationManager and I want this notification keep noticing mutable step count.

    private fun secondNoti(stepCount: Int?) {
        Log.d("결과1", "$todayTotalStepCount")
        Log.d("결과2", "$stepCount")


        if (Build.VERSION.SDK_INT >= 26) {
            val CHANNEL_ID = "my_app"
            val channel = NotificationChannel(
                CHANNEL_ID,
                "MyApp", NotificationManager.IMPORTANCE_DEFAULT
            )
            (getSystemService(NOTIFICATION_SERVICE) as NotificationManager).createNotificationChannel(
                channel
            )
            val notification = NotificationCompat.Builder(this, CHANNEL_ID)
                .setSmallIcon(R.drawable.ic_logo)
                .setContentTitle("${todayTotalStepCount?.value} 걸음")
                .setColor(ContextCompat.getColor(this, R.color.main_color))
                .build()
            startForeground(1, notification)
        }
    }
}

So as you can see above, I tried to show this value as title with below line.

.setContentTitle("${todayTotalStepCount?.value} 걸음")

However It shows null .

I print todayTotalStepCount on log, and it says:

 androidx.lifecycle.MutableLiveData@759014c

I tried to read this MutableLiveData value by using observe .

  todayTotalStepCount?.observe(viewLifecycleOwner) { value ->
        receivedStep = value
    }

But It can't define viewLifecycleOwner .

在此处输入图像描述

So My question is how can I read this MutableLiveData value in Notification which runs on background as separate function.

I'm a newbie in Kotlin, So please help me with detail code.

Thank you!

You shouldn't use global static variable for this type of data, because it's not being shared between different app instance, and easy to be reseted to null if the app is cleared

My suggestion is define your custom BroadcastReceiver to transfer data between your Service and the main app, which is well-documented in here

1/ Define your own BroadcastReceiver class

class CurrentStepCountReceiver: BroadcastReceiver

2/ Register your receiver in Manifest

<receiver android:name=".CurrentStepCountReceiver" android:exported="false">
    <intent-filter>
        <action android:name="your.package.name.currentstepcountreceiver" />
    </intent-filter>
</receiver>

3/ Do your logic in onReceived() in CurrentStepCountReceiver

override fun onReceive(context: Context, intent: Intent) {
    // Retrieve the step count via intent data
    // Show your notification here
}

4/ When your ForegroundService get new sensor data, pass the data to the Intent and use sendBroadcast to wake up any registered receiver, which is now your code inside onReceived

Intent().also { intent ->
    intent.setAction("your.package.name.currentstepcountreceiver")
    intent.putExtra("step_count", newStepCount)
    sendBroadcast(intent)
}

Hope this helps

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM