警报管理器Android

时间:2017-03-27 19:51:39

标签: android alarmmanager

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类中。

以下代码应该在23:52和之后的每20分钟显示一个toast(在AlarmReceiver类的onReceive()方法中声明)

AlarmReceiver扩展了BroadcastReceiver。

代码编译没有错误但由于某种原因它没有显示toast。

注意:代码在ELAPSED_REALTIME_WAKEUP中运行良好。我只有RTC_WAKEUP有问题。所以其他一切都必须是正确的。 startAlarm()方法内部有问题。

2 个答案:

答案 0 :(得分:1)

我已尝试过您的代码,如下所示进行了一些修改。

    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表示,返回自启动以来的毫秒数,包括睡眠时间和RTC表示的时间,System.currentTimeMillis()中的时间(以UTC为挂钟时间)。

答案 1 :(得分:0)

看起来你需要为意图设置一个动作:

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>

这应该可以解决问题。您必须对广播接收器使用它的意图采取独特的行动。