java - Android:设置闹钟不触发
问题描述
我正在编写一个在 5 秒后触发警报的基本程序。但是,即使在 30 秒后,也不会触发警报(我的个人警报控制器中的打印语句没有执行)。这似乎很奇怪,考虑到我似乎已经正确计算了警报时间,将包含警报控制器PendingIntent
(AlarmReceiver
AlarmManager
AlarmReceiver
MainActivity.kt
import android.app.AlarmManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
try {
// Initialize the time in which we want to trigger the alarm
val currTimeMs = System.currentTimeMillis()
val fiveSecsLaterMs = currTimeMs + 5 * 1000
println("currTimeMs = $currTimeMs")
println("fiveSecsLaterMs = $fiveSecsLaterMs")
// Initialize the alarm signal
val intent = Intent(applicationContext, AlarmReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(applicationContext, 1, intent, 0)
// Send the alarm signal to our AlarmManager
val alarmManager = applicationContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmManager[AlarmManager.RTC_WAKEUP, fiveSecsLaterMs] = pendingIntent
} catch (e: Exception) {
println("Cannot print alarm!")
}
}
}
警报接收器.java:
package com.example.alarmtestsetter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.widget.Toast;
public class AlarmReceiver extends BroadcastReceiver {
MediaPlayer mp;
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("RECEIVED ALARM!!!!");
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone r = RingtoneManager.getRingtone(context, notification);
r.play();
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.alarmtestsetter">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".AlarmReceiver" android:process=":remote" />
</application>
</manifest>
解决方案
你试过使用AlarmManagerCompat
吗?
// Initialize the alarm signal
val intent = Intent(applicationContext, AlarmReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(applicationContext, 1, intent, 0)
val alarmManager = applicationContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager
AlarmManagerCompat.setExactAndAllowWhileIdle(
alarmManager,
AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + (5 * DateUtils.SECOND_IN_MILLIS),
pendingIntent
)
推荐阅读
- uwp - What invokes the Property-changed callback of DependencyProperty in UWP?
- amazon-web-services - AWS passive failover pricing
- android - 从大整数设置进度条的最大值
- javascript - 以角度 6 将 Json 字符串转换为 json 数组
- hadoop - 从 Oracle 导入 Sqoop 失败,出现“线程“主”java.lang.NoClassDefFoundError:org/apache/hadoop/mapreduce/InputFormat 中的异常”
- machine-learning - 位置坐标表示
- python - 保存原始 html 表单 django
- c - 在C中找到一个数字的无平方除数
- java - 在收集应用程序中添加下载按钮
- rabbitmq - 将“amq.rabbitmq.event”交换配置到不同的虚拟主机?