Приём широковещательных сообщений в workManager
Есть необходимость получать данные из Activity в WorkManager используя Broadcastreciever. Регистрация Broadcastreciever, происходит программно. Если я размещаю Broadcastreciever в Activity и шлю сообщения из Activity или из метода doWork() WorkManager. Все отправленные сообщения успешно ловятся Broadcastreciever (Да это обратная мне задача, получение данных в Activity) Когда я размещаю Broadcastreciever в WorkManager, то сообщения в методе onReceive ловятся в случае если их отправка идёт из WorkManager. Если я отправляю сообщение из Activity, то Broadcastreciever создаётся но метод onReceive не вызывается. Вот код Activity:
import android.content.Intent
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.navigateUp
import androidx.navigation.ui.setupActionBarWithNavController
import androidx.work.Data
import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.WorkManager
import ru.alexandrorlov.ed_workmanager.Config.BROADCAST_ACTION
import ru.alexandrorlov.ed_workmanager.Config.KEY_DATA
import ru.alexandrorlov.ed_workmanager.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private val workManager = WorkManager.getInstance(this)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.fab.setOnClickListener {
val request = OneTimeWorkRequestBuilder<MyWorker>()
.addTag("")
.build()
Intent().also { intent ->
intent.action = BROADCAST_ACTION
intent.putExtra(KEY_DATA, "outputData.toString()")
sendBroadcast(intent)
}
workManager.enqueue(request)
}
}
}
Вот код WorkManager:
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.util.Log
import androidx.work.Data
import androidx.work.Worker
import androidx.work.WorkerParameters
import ru.alexandrorlov.ed_workmanager.Config.BROADCAST_ACTION
import ru.alexandrorlov.ed_workmanager.Config.KEY_DATA
import java.util.concurrent.TimeUnit
class MyWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
private val receiver by lazy { myReceiver() }
var inputData: String = ""
init {
val intentFilter = IntentFilter(BROADCAST_ACTION)
applicationContext.registerReceiver(
receiver,
intentFilter
)
Log.d("OAE", "init MyWorker")
}
override fun doWork(): Result {
return try {
Log.d("OAE", "doWork inputData = $inputData")
val outputData: StringBuilder = StringBuilder(inputData)
outputData.append("doWork to outputData")
val data = Data.Builder()
.putString(KEY_DATA, outputData.toString())
.build()
Result.success()
} catch (throwable: Throwable) {
Result.failure()
} finally {
applicationContext.unregisterReceiver(receiver)
}
}
private fun myReceiver(): BroadcastReceiver {
return object : BroadcastReceiver() {
init {
Log.d("OAE", "myReceiver create")
}
override fun onReceive(context: Context?, intent: Intent?) {
Log.d("OAE", "onReceive Start")
}
}
}
}
вот код activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_marginEnd="@dimen/fab_margin"
android:layout_marginBottom="16dp"
app:srcCompat="@android:drawable/ic_dialog_email" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
Вот код Config
object Config {
const val KEY_DATA = "key_worker_data"
const val BROADCAST_ACTION = "ru.alexandrorlov.action.broadcast_receiver"
}
Источник: Stack Overflow на русском