Kotlin AlarmManager.setExact() 永远不会触发

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

我确实尝试过让这个警报工作,但它根本不调用 AlarmReceiver 类中的 onReceive() 。我已经遵循了一百万个指南但无济于事,并且我在几个 API 版本(24 和 34)中尝试过它

class MainActivity : ComponentActivity() {
    fun addAlarm() {
        val intent = Intent(this, AlarmReceiver::class.java)
        val pendingIntent = PendingIntent.getBroadcast(
            this,
            0,
            intent,
            PendingIntent.FLAG_IMMUTABLE)
        val timeToWakeupInMillis: Long = 3000//System.currentTimeMillis() + 3000
        val alarmManager = this.applicationContext.getSystemService(ALARM_SERVICE) as AlarmManager
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, timeToWakeupInMillis, pendingIntent)
    }

    // More functions here.
}

这是简单的接收器类:

class AlarmReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        Toast.makeText(context,"Alarm!",Toast.LENGTH_LONG).show()
    }
}

在 AndroidManifest.xml 中,我拥有 SCHEDULE_EXACT_ALARM 权限:

<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>

我确实有请求许可的代码,但为了酿造而将其遗漏在上面。它正在工作,它将用户重定向到“警报和提醒”页面,简而言之:

if (alarmManager.canScheduleExactAlarms() == false) {
  Intent().also { intent -> intent.action = ACTION_REQUEST_SCHEDULE_EXACT_ALARM

    this.startActivity(intent)
  }
}

代码运行良好,setExact() 被调用,没有异常,但 onReceive() 从未被调用。这让我发疯,请帮忙!

kotlin android-intent alarmmanager
1个回答
0
投票

您是否在

AndroidManifest.xml
中注册了您的接收器:

...
  <application>

  ...

    <receiver
      android:name=".AlarmReceiver"
      android:exported="false">

        <intent-filter>
          <action android:name="YOUR_ACTION_NAME"/>
        </intent-filter>

    </receiver>

  </application>
...

当您为警报创建意图时,您还应该指定操作名称:

fun addAlarm() {
  val intent = Intent(this, AlarmReceiver::class.java)
  intent.setAction("YOUR_ACTION_NAME")
  val pendingIntent = PendingIntent.getBroadcast(
    ...
© www.soinside.com 2019 - 2024. All rights reserved.