警报管理器 Android
Alarm Manager Android
private void startAlarm() {
AlarmManager alarmMgr;
PendingIntent alarmIntent;
alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
alarmIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 52);
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
1000 * 60 * 20, alarmIntent);
}
startAlarm() 方法在 MainActivity class.
以下代码应在 23:52 和此后每 20 分钟显示一次吐司(在 AlarmReceiver class 的 onReceive() 方法中声明)
AlarmReceiver 扩展 BroadcastReceiver。
代码编译没有错误,但由于某种原因它没有显示 toast。
注意:代码在 ELAPSED_REALTIME_WAKEUP 下运行良好。我只有 RTC_WAKEUP 有问题。所以其他一切都必须是正确的。只有 startAlarm() 方法内部有问题。
看来您需要为意图设置一个操作:
Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
intent.setAction("YourPackageName.YourAction");
alarmIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);
并且在清单中:
<receiver android:name=".AlarmReciever">
<intent-filter>
<action android:name="YourPackageName.YourAction" />
</intent-filter>
</receiver>
这应该可以解决问题。您必须具有独特的操作意图才能将其与广播接收器一起使用。
我已经尝试了您的代码并做了一些修改,如下所示。
private void startAlarm() {
AlarmManager alarmMgr;
PendingIntent alarmIntent;
alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
alarmIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 2);
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
1000 * 20, alarmIntent);
}
此代码适用于 AlarmManager.RTC_WAKEUP。如果它不适合您,请在安装后重新启动您的设备。重启完成后,启动您的应用程序。然后它应该触发警报,并且每隔 20 秒警报就会重复触发一次。
您还可以查看 RTC_WAKEUP 和 ELAPSED_REALTIME_WAKEUP 之间的区别。来自 android 文档,elapsedRealtime 表示自启动后 Returns 毫秒,包括睡眠时间和 RTC 表示 System.currentTimeMillis() 中的时间(UTC 中的挂钟时间)。
private void startAlarm() {
AlarmManager alarmMgr;
PendingIntent alarmIntent;
alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
alarmIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 52);
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
1000 * 60 * 20, alarmIntent);
}
startAlarm() 方法在 MainActivity class.
以下代码应在 23:52 和此后每 20 分钟显示一次吐司(在 AlarmReceiver class 的 onReceive() 方法中声明)
AlarmReceiver 扩展 BroadcastReceiver。
代码编译没有错误,但由于某种原因它没有显示 toast。
注意:代码在 ELAPSED_REALTIME_WAKEUP 下运行良好。我只有 RTC_WAKEUP 有问题。所以其他一切都必须是正确的。只有 startAlarm() 方法内部有问题。
看来您需要为意图设置一个操作:
Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
intent.setAction("YourPackageName.YourAction");
alarmIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);
并且在清单中:
<receiver android:name=".AlarmReciever">
<intent-filter>
<action android:name="YourPackageName.YourAction" />
</intent-filter>
</receiver>
这应该可以解决问题。您必须具有独特的操作意图才能将其与广播接收器一起使用。
我已经尝试了您的代码并做了一些修改,如下所示。
private void startAlarm() {
AlarmManager alarmMgr;
PendingIntent alarmIntent;
alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
alarmIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 2);
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
1000 * 20, alarmIntent);
}
此代码适用于 AlarmManager.RTC_WAKEUP。如果它不适合您,请在安装后重新启动您的设备。重启完成后,启动您的应用程序。然后它应该触发警报,并且每隔 20 秒警报就会重复触发一次。
您还可以查看 RTC_WAKEUP 和 ELAPSED_REALTIME_WAKEUP 之间的区别。来自 android 文档,elapsedRealtime 表示自启动后 Returns 毫秒,包括睡眠时间和 RTC 表示 System.currentTimeMillis() 中的时间(UTC 中的挂钟时间)。