警报管理器 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 中的挂钟时间)。