我确实尝试过让这个警报工作,但它根本不调用 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() 从未被调用。这让我发疯,请帮忙!
您是否在
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(
...