В чем может быть проблема с регистратором, который не работает

#android #kotlin #broadcastreceiver

Вопрос:

Пока определение получателя в Манифесте работает, я борюсь с динамическим определением. Мое приложение содержит этот код для создания трансляции

         val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
        val intent = Intent(this, AlarmReceiver::class.java)
        intent.setAction("com.example.PetesTimerOne.Broadcast")
        val pendingIntent = PendingIntent.getBroadcast(this, ALARM_REQUEST_CODE,
            intent, PendingIntent.FLAG_UPDATE_CURRENT)
        alarmManager.setExact(
            AlarmManager.RTC_WAKEUP,
            firstAlarm.timeInMillis,
            pendingIntent
 

и для приема у меня есть класс BoardcastReceiver

 package com.example.PetesTimerOne

import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.widget.Toast
import android.os.Build
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import androidx.core.content.getSystemService
import android.annotation.TargetApi

class AlarmReceiver: BroadcastReceiver() {

    companion object {
        const val NOTIFICATION_ID = 100
        const val NOTIFICATION_CHANNEL_ID = "1000"
    }

    override fun onReceive(context: Context, intent: Intent) {
        Toast.makeText(context, "onReceive called", Toast.LENGTH_SHORT).show()
        
        //createNotificationChannel(context)
        //notifyNotification(context)

        // println("onReceive called")
    }
 

Если я определяю получателя в манифесте через

     <receiver
        android:name=".AlarmReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="com.example.PetesTimerOne.Broadcast"></action>
        </intent-filter>
    </receiver>
 

это работает нормально. Однако, когда я вместо этого пытаюсь использовать динамическое определение в моей основной деятельности

 private val alarmReceiver = AlarmReceiver()
 

и в onCreate()

 override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    // alarm receiver
    val iF = IntentFilter(cBroadcastName)
    registerReceiver(alarmReceiver, iF)

    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)
    setSupportActionBar(binding.toolbar)

    val navController = findNavController(R.id.nav_host_fragment_content_main)
    appBarConfiguration = AppBarConfiguration(navController.graph)
    setupActionBarWithNavController(navController, appBarConfiguration)
}
 

это НЕ работает, и я не могу понять, почему. Я проверил множество учебных пособий и не смог определить, чего мне не хватает.

Комментарии:

1. Это будет работать только в том случае, если ваше приложение запущено при срабатывании будильника. Как вы это проверяете?

2. Спасибо, Дэвид, да, приложение работает под управлением ofc. Я запускаю приложение и запускаю будильник, а обратный вызов никогда не вызывается (например , println не выдает выходных данных, тосты не всплывают и т. Д.), В отличие от определения в XML-манифесте, которое работает как шарм.

3. В этом нет никакого смысла. Ваш код выглядит нормально. Пожалуйста, отредактируйте свой вопрос и опубликуйте код от MainActivity.onCreate() , а также код от AlarmReceiver .

4. Спасибо, Дэвид, добавил больше кода.

5. как это cBroadcastName определяется?