Приём широковещательных сообщений в workManager

Рейтинг: 1Ответов: 0Опубликовано: 09.04.2023

Есть необходимость получать данные из 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"
    }

Ответы

Ответов пока нет.