如何为特定的星期几设置重复通知?

Posted

技术标签:

【中文标题】如何为特定的星期几设置重复通知?【英文标题】:How to set repeated notification for specific day of week? 【发布时间】:2016-02-06 13:08:24 【问题描述】:

我正在寻找在工作日设置通知。我在警报对话框中添加了一串天来显示天数。

我想设置用户在警报对话框中选择的日历中的日期。此外,这应该在下周的同一天重复。

我已放置时间选择器对话框来选择通知时间。但是如果我这样做 c.getTime() ,那么我会得到当前的日期和时间。

如何设置其他日子的通知?就像今天是星期一,我想在星期三创建通知?如何在日历中设置星期三?

  c.set(Calendar.HOUR_OF_DAY, hour);
        c.set(Calendar.MINUTE, minute);
        c.set(Calendar.SECOND,0);
        c.set(Calendar.MILLISECOND,0);

        notification = c.getTime();
        notificationTime = df.format(notification);
        notifyTime.setText(notificationTime);
        Toast.makeText(getApplicationContext(),String.valueOf(notification),Toast.LENGTH_SHORT).show();

对于通知,我正在使用警报管理器。

 private void setAlarm(Calendar targetmCalen) 

    Intent intent = new Intent(getBaseContext(),NotificationReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), RQS_1, intent, 0);
    AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,targetmCalen.getTimeInMillis(),
            AlarmManager.INTERVAL_DAY *7, pendingIntent);

    ComponentName receiver = new ComponentName(getApplicationContext(),NotificationReceiver.class);
    PackageManager pm = getApplicationContext().getPackageManager();

    pm.setComponentEnabledSetting(receiver,
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
            PackageManager.DONT_KILL_APP);

    Toast.makeText(getApplicationContext(),"Notification Set",Toast.LENGTH_SHORT).show();

选择日期的警报对话框:

  selectDay.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            final AlertDialog.Builder builder = new AlertDialog.Builder(AddEventActivity.this);

            builder.setSingleChoiceItems(R.array.day_array, -1,
                    new DialogInterface.OnClickListener() 
                        public void onClick(DialogInterface dialog, int item) 

                            String[] day = getBaseContext().getResources().getStringArray(R.array.day_array);

                            selectDay.setText(day[item]);

                            dialog.dismiss();
                        
                    );
            builder.show();
        
    );

我必须在警报对话框内的日历实例中设置 dayofweek 吗?喜欢

c.set(Calendar.DAY_OF_WEEK)?

编辑:

我试图这样做。但是如果我多次选择一天,这可能每次都会提前一天。

 selectDay.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            final AlertDialog.Builder builder = new AlertDialog.Builder(AddEventActivity.this);

            builder.setSingleChoiceItems(R.array.day_array, -1,
                    new DialogInterface.OnClickListener() 
                        public void onClick(DialogInterface dialog, int item) 

                            String[] day = getBaseContext().getResources().getStringArray(R.array.day_array);

                            selectDay.setText(day[item]);

                            dayOfWeek = day[item];

                            switch (dayOfWeek)
                            
                                case  "Mon":
                                    c.set(Calendar.DAY_OF_WEEK,2);
                                    c.getTime();
                                    Toast.makeText(getApplicationContext(),String.valueOf(c.getTime()),Toast.LENGTH_SHORT).show();
                                    break;
                                case "Tue":

                                    c.set(Calendar.DAY_OF_WEEK, 3);
                                    c.getTime();
                                    Toast.makeText(getApplicationContext(),String.valueOf(c.getTime()),Toast.LENGTH_SHORT).show();
                                    break;
                                case "Wed":
                                    c.set(Calendar.DAY_OF_WEEK, 4);
                                    c.getTime();
                                    Toast.makeText(getApplicationContext(),String.valueOf(c.getTime()),Toast.LENGTH_SHORT).show();
                                    break;

                                case "Thu":
                                    c.set(Calendar.DAY_OF_WEEK, 5);
                                    c.getTime();
                                    Toast.makeText(getApplicationContext(),String.valueOf(c.getTime()),Toast.LENGTH_SHORT).show();
                                    break;

                                case "Fri":
                                    c.set(Calendar.DAY_OF_WEEK, 6);
                                    c.getTime();
                                    Toast.makeText(getApplicationContext(),String.valueOf(c.getTime()),Toast.LENGTH_SHORT).show();
                                    break;

                                case "Sat":
                                    c.set(Calendar.DAY_OF_WEEK, 7);
                                    c.getTime();
                                    Toast.makeText(getApplicationContext(),String.valueOf(c.getTime()),Toast.LENGTH_SHORT).show();
                                    break;

                                case "Sun":

                                    c.set(Calendar.DAY_OF_WEEK,1);
                                    c.getTime();
                                    Toast.makeText(getApplicationContext(),String.valueOf(c.getTime()),Toast.LENGTH_SHORT).show();
                            

                            dialog.dismiss();
                        
                    );
            builder.show();
        
    );

请帮忙..

【问题讨论】:

将通知放入service 我已经完成了。我收到通知,但不是在所需的日期。我该如何设置日期? 你总是可以创建一个 Date d 对象,然后 c.setTime(d) 请问你能用代码告诉我吗?请检查编辑。 我不确定您是否有当前日期,但如果有,请在现在时间创建一个日期对象并将其天数加 7(因为您希望它在同一天)然后您可以c.setTime(日期对象) 【参考方案1】:
public class TimerReceiver extends BroadcastReceiver 

public  void scheduleAlarms(Context paramContext) 

    Calendar calendar = Calendar.getInstance();

    if (strmyTime.contains("One Week")) 
        calendar.set(Calendar.DATE, 7);

        registerReceiver(paramContext, calendar, AlarmManager.INTERVAL_DAY * 7);
    



public  void registerReceiver(Context paramContext, Calendar calender, long interval) 

    AlarmManager localAlarmManager = (AlarmManager) paramContext.getSystemService(Context.ALARM_SERVICE);
    PendingIntent localPendingIntent = PendingIntent.getService(paramContext, 0,
            new Intent(paramContext, NotificationService.class), PendingIntent.FLAG_UPDATE_CURRENT);

    localAlarmManager.setRepeating(AlarmManager.RTC, calender.getTimeInMillis(), interval, localPendingIntent);



@Override
public void onReceive(Context context, Intent intent) 


    scheduleAlarms(context);
    context.startService(new Intent(context, Notification.class));
        

【讨论】:

对于重复闹钟,我可以做 Interval_Day * 7。但是如何设置日期?【参考方案2】:

我希望你已经解决了你的问题。但我仍然会发布我的解决方案。所以如果有人绊倒。

private void sendNotification()
    Intent notificationIntent = new Intent(HomeActivity.this, NotificationReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
            NOTIFICATION_REQUEST_CODE,
            notificationIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, CONST.NOTIFICATION_TIME_HOUR);
    calendar.set(Calendar.MINUTE, 0);
    for (int i = 1; i < 8; ++i)
        if (i != 6)
            calendar.set(Calendar.DAY_OF_WEEK, i);
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), CONST.NOTIFICATION_INTERVAL, pendingIntent);
        
    

这里long NOTIFICATION_INTERVAL = 7 * 24 * 60 * 60 * 1000; & int NOTIFICATION_TIME_HOUR = 9;

【讨论】:

嗨@shafi,想知道“NOTIFICATION_REQUEST_CODE”是否每次都需要唯一? @Energy 不,它没有。您可以将其作为整个应用程序的常量。 您能给我一个建议吗?目前,我让用户选择他们想要的任何一天。 (就像我给 7(monday.~ sunday) 复选框)。所以假设用户选择周一,周二。我在我的 forloop 中运行上面的 sendNotification(),我将“day”作为我的参数。但是,如果我先选择“今天”复选框,它会起作用。例如,“今天”是星期二。然后我选择复选框作为周二和周一​​。然后它工作。但另一轮(周一和周二)没有。 奇怪。在我得到你的代码之后。有用。以前我的 forloop 在 sendNotification() 部分之外。这是因为意图吗?因为如果我把 forloop 放在 outsie 上,那么每次我创建一个新的意图。但如果我搬到里面,它只使用一个打算同时通知? 我不知道为什么,但你不需要每次都创建 Intent。因为意图只是为了指导它发生后要做什么。所以每次都是一样的。现在对于建议部分,我认为缺少的是这种方法今天将其作为基本事实。因此,为了使其适用于任意一天,您必须从今天开始计算。即今天是星期三,所以星期天是 4 天。照此计算。我希望它有所帮助。祝你好运

以上是关于如何为特定的星期几设置重复通知?的主要内容,如果未能解决你的问题,请参考以下文章

Angular Material Date Picker 仅设置可选择的特定星期几(例如:星期一)

在android中设置重复星期几闹钟

在 datepicker 中选择特定日期时,如何自动填充特定的星期几?

Moment js按星期和星期几获取一个月中的特定日期

如何在 Youtrack Workflow 中查看星期几

在特定日期重复 UILocalNotification