Не срабатывает onReceive в BroadcastReceiver

Для аналитики мне нужно знать что юзер выбрал для того, чтоб поделиться контентом. Для этого я использую Google ShareSheet.

Для того, чтоб можно было из Google ShareSheet получить значение которые выбрал пользователь нужно использовать PendingIntent, вот как это у меня получилось

...
override fun doOpenShareSheet(
        activity: AppCompatActivity
    ) {
        var flag: Int = PendingIntent.FLAG_UPDATE_CURRENT

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            flag = PendingIntent.FLAG_IMMUTABLE
        }

        val pi: PendingIntent = PendingIntent.getBroadcast(
            activity,
            0,
            Intent(activity, ChooserBroadcastReceiver::class.java),
            flag
        )

        //Implement Google ShareSheet
        val share: Intent = Intent.createChooser(
            Intent().apply {
                action = Intent.ACTION_SEND
                putExtra(Intent.EXTRA_TEXT, config.url)

                //Passing content URI to image to be displayed
                flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
                type = "application/url"
            },
            config.mediaTitle,
            pi.intentSender
        )

        activity.startActivity(share)
    }
...

Теперь для того, чтоб получить значение мне нужно зарегестрировать BroadcastReceiver из кода (в Манефесте не получиться, так как мне нужно передать значение в конструктор ресивера).

Вот, что у меня получилось

...
class ChooserBroadcastReceiver(private val vm: MyViewModel): BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        val selectedComponent: String = intent?.extras?.get(Intent.EXTRA_CHOSEN_COMPONENT).toString()
        vm.doOnChooserBroadcastReceiver(selectedComponent = selectedComponent)
    }
}
....
@AndroidEntryPoint
class MyFragment : Fragment() {
...
    override fun onResume() {
        super.onResume()
        registerBroadcast()
    }

    private fun registerBroadcast() {
        chooserBroadcastReceiver = ChooserBroadcastReceiver(vm = vm)
        val intentFilter = IntentFilter()
        intentFilter.addAction(Intent.ACTION_SEND)

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            requireActivity().registerReceiver(chooserBroadcastReceiver, intentFilter, RECEIVER_EXPORTED)
        } else {
            requireActivity().registerReceiver(chooserBroadcastReceiver, intentFilter)
        }
    }

...

но почему то значение я не получаю, то есть я вижу, что ивент происходит и я могу выбрать как поделиться контентом (через Google ShareSheet), но ивент не приходит в onReceive

P.S. Для эксперемента я попробовал убрать из конструктора вью модель и зарегистрировать ресивер через манифест и все заработало. Вот так

<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <application>
        <receiver
            android:name=".ui.MyBroadcastReceiver"
            android:exported="false">
        </receiver>
    </application>
</manifest>

Но мне нужно передать параметр в конструктор, поэтому этот способ мне не подходит

Что делаю не так? Почему когда регестрирую через манифест все работает, когда через код - ивент не приходит?


Ответы (0 шт):