首页 > 解决方案 > registerReceiver 不起作用可能是什么问题

问题描述

虽然在 Manifest 中定义接收器是有效的,但我在动态定义方面遇到了困难。我的应用程序包含用于创建广播​​的代码

        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>

它工作正常。但是,当我在 MainActivity 中尝试动态定义时

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)
}

它不起作用,我不知道为什么。我查看了许多教程,但找不到我错过的内容。

标签: androidkotlinbroadcastreceiver

解决方案


推荐阅读