使用警报管理器的每日通知

时间:2013-07-31 10:50:01

标签: java android alarmmanager

我编写了这段代码,每天都会执行并显示通知:

class DailyNotification extends BroadcastReceiver {

    // Register the alarm and set it at 7am everyday (repeating mode)
    public static void registerAlarm(Context paramContext) {
        Calendar calendar = Calendar.getInstance();
        if (calendar.get(Calendar.HOUR_OF_DAY) >= 7) {
            calendar.add(7, 1);
        }
        calendar.set(Calendar.HOUR_OF_DAY, 7);
        calendar.set(Calendar.MINUTE, 00);
        calendar.set(Calendar.SECOND, 00);

        // PendingIntent that will perform a broadcast
        PendingIntent localPendingIntent = PendingIntent
                .getBroadcast(
                        paramContext,
                        22341,
                        new Intent(
                                "com.bestweightmanager.example.exampledailynotification.DAILY_NOTIFICATION"),
                        PendingIntent.FLAG_UPDATE_CURRENT);
        // Retrieve an AlarmManager to set a repeating daily alarm
        ((AlarmManager) paramContext.getSystemService("alarm")).setRepeating(1,
                calendar.getTimeInMillis(), 1000,
                localPendingIntent);
    }
}

最明显的文件如下所示:

<receiver
    android:name=".utils.DailyNotification"
    android:process=":remote" >
    <intent-filter>
        <action android:name="com.bestweightmanager.example.exampledailynotification.DAILY_NOTIFICATION" />
        <action android:name="android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE" />
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

但我没有收到任何通知。有谁能建议我如何解决这个问题?

此外,以下代码的含义是什么

Calendar calendar = Calendar.getInstance();
if (calendar.get(Calendar.HOUR_OF_DAY) >= 7) {
    calendar.add(7, 1);
}

1 个答案:

答案 0 :(得分:1)

部分回答。

1

替换代码中的行

((AlarmManager) paramContext.getSystemService("alarm")).setRepeating(1,
                calendar.getTimeInMillis(), 1000,
                localPendingIntent);

这一行:

((AlarmManager) paramContext.getSystemService(Context.ALARM_SERVICE)).setRepeating(1,
                calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY,
                localPendingIntent);

您实际上需要获得系统服务 - Context.ALARM_SERVICE

而不是将重复频率设置为1000毫秒,您需要使用AlarmManager.INTERVAL_DAY,以便在所需的设定时间内每天触发它。

2

关于此代码的含义:

Calendar calendar = Calendar.getInstance();
if (calendar.get(Calendar.HOUR_OF_DAY) >= 7) {
    calendar.add(7, 1);
}

这里calendar.add(7, 1)对我来说并不合理。日历的add()函数用于将给定金额添加到特定日历字段,由唯一整数标识。

如果您的代码行calendar.add(7, 1);被替换为calendar.add(Calendar.DATE, 1);,则此代码可能会有所帮助。 如果当前的小时数大于7(即当前时间超过上午7点),它将实际检查注册警报时,将比设置日历对象(稍后用于注册警报)下一个日期上午7点(明天)。

3

此外,我对您的清单文件中的声明表示怀疑。您需要使用您所指的来源进行交叉检查。

通常,AlarmManager的清单文件结构应该如下所示:

<application>

    <activity>
        <intent-filter>
            <action/>

            <category/>
        </intent-filter>
    </activity>

    <receiver android:name=".DailyNotification" />
</application>

希望有所帮助。