registerReceiver 不工作可能是什么问题

问题描述 投票:0回答:1

虽然在 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)
}

它不起作用,我不明白为什么。我检查了很多教程,但找不到我错过的东西。

android kotlin broadcastreceiver
1个回答
0
投票

我挣扎了几个小时。终于让它工作了。

intent中不要设置class,只设置action,所以这里:

val intent = Intent(this,AlarmReceiver::class.java)

进入

val intent = Intent("com.example.PetesTimerOne.Broadcast")

© www.soinside.com 2019 - 2024. All rights reserved.