如何制作具有不同内容的重复通知

Posted

技术标签:

【中文标题】如何制作具有不同内容的重复通知【英文标题】:How to make repeating notifications with different content 【发布时间】:2019-07-31 15:20:04 【问题描述】:

我需要向用户显示不同内容的重复通知。我使用 BroadcastReceiver 并通过 AlarmManager 设置通知。

我知道我可以使用AlarmManager.setRepeating,但是每次显示的内容都是一样的。

例如,我需要根据用户选择的一周每周显示一次通知。在每个通知中,我需要显示当前周和一些不同的文本。我在 *** 上没有找到解决方案。

这里是相关代码

long timeInMills = mSharedPreferences.getLong("key_millis", 0);

Calendar alarmCalendar = Calendar.getInstance();
alarmCalendar.setTimeInMillis(timeInMills);
alarmCalendar.set(Calendar.HOUR_OF_DAY, 10);
alarmCalendar.set(Calendar.MINUTE, 0);

int currentWeek = (int) Utils.getTotalWeeks(timeInMills);

if (currentWeek <= 20) 
    AlarmHelper alarmHelper = AlarmHelper.getInstance();
    for (int i = currentWeek + 1; i < 21; i++) 
        alarmCalendar.add(Calendar.DATE, 7 * (currentWeek + 1));
        long time = alarmCalendar.getTimeInMillis();
        alarmHelper.setWeekAlarm(getApplicationContext(), WeekReceiver.class, time, i, i);
    

AlarmHelper 类如下。

public class AlarmHelper 

    private static AlarmHelper instance;

    public static AlarmHelper getInstance() 
        if (instance == null) 
            instance = new AlarmHelper();
        

        return instance;
    

    public void setWeekAlarm(Context context, Class<?> receiver, long time, int week, int req_code) 

        Intent intent = new Intent(context, receiver);
        intent.putExtra("week_title", "your week " + week);
        intent.putExtra("req_code", req_code);

        //cancel already existed alarm
        cancelWeekAlarm(context, receiver, req_code);

        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, req_code, intent,
                PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, time, pendingIntent);
    

    public void cancelWeekAlarm(Context context, Class<?> receiver, int req_code) 
        Intent intent = new Intent(context, receiver);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, req_code, intent,
                PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(pendingIntent);
        pendingIntent.cancel();
    

问题是,如果用户在第一周,那么会创建 20 个通知,我认为我的方法不是很好,也许你可以帮我找到另一个解决方案?

【问题讨论】:

【参考方案1】:

我不太确定您的代码的目的是什么,因为我没有清楚地理解这个问题。但是,我认为我在您的代码中发现了一个我认为应该分享的问题。

当您添加 Calendar 事件时,我认为您正在尝试在不同的周内逐步增加周数。但是,在您的代码中,您似乎正在设置某一周内的所有事件。

我指的是下面的代码。请看代码中的cmets。

if (currentWeek <= 20) 
    AlarmHelper alarmHelper = AlarmHelper.getInstance();
    for (int i = currentWeek + 1; i < 21; i++) 

        // I think the following line should contain currentWeek + i instead of currentWeek + 1
        // alarmCalendar.add(Calendar.DATE, 7 * (currentWeek + 1)); 

        alarmCalendar.add(Calendar.DATE, 7 * (currentWeek + i)); // Like this to create events in consecutive weeks.

        long time = alarmCalendar.getTimeInMillis();
        alarmHelper.setWeekAlarm(getApplicationContext(), WeekReceiver.class, time, i, i);
    

如果有帮助,请告诉我!

【讨论】:

我的代码完全可以工作。在代码中我错过了本周并从下周开始通知。 您认为这是因为您没有在循环中添加当前周吗?因为循环从 currentweek + 1 开始? 我很困惑。我不记得我为什么使用 (Calendar.Date, 7 * (currentWeek + 1));而是简单 (Calendar.Date, 7);谢谢..我会检查它。 没问题。我希望你能找到问题。让我知道这是否有帮助! :) 很高兴知道这有帮助!祝你有美好的一天!

以上是关于如何制作具有不同内容的重复通知的主要内容,如果未能解决你的问题,请参考以下文章

如何在每个[重复]中制作具有不同数量单元格的部分

如何在android中具有某些条件的最新sdk版本中重复通知?

如何每天在不同时间重复本地通知

如何在每天不同的时间在android studio中设置每日重复通知?

以不同的时间重复通知

如何将本地通知重复间隔设置为自定义时间间隔?