Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android中设置工作日警报_Android_Calendar_Alarmmanager_Android Alarms - Fatal编程技术网

如何在android中设置工作日警报

如何在android中设置工作日警报,android,calendar,alarmmanager,android-alarms,Android,Calendar,Alarmmanager,Android Alarms,我有一个设想 设置报警(周一至周五) 假设我选择的时间是:hour=9,minutes=15,am\u pm=“am” 现在我想为每个周一到周五的上午9:15设置闹钟 下面的代码我试过了,但没有得到想要的结果 if(choice.equals("Week Days (Mon-Fri)")) { for(int a = 2; a <= 5; a++) //here I am assuming a is from 2 to 5 (calendar DAY_OF_WEEK from Mo

我有一个设想

设置报警(周一至周五)

假设我选择的时间是:
hour=9,minutes=15,am\u pm=“am”

现在我想为每个
周一到周五的上午9:15设置闹钟

下面的代码我试过了,但没有得到想要的结果

if(choice.equals("Week Days (Mon-Fri)"))
{
    for(int a = 2; a <= 5; a++) //here I am assuming a is from 2 to 5 (calendar DAY_OF_WEEK from Monday to Friday)
    {
        Calendar alarmCalendar = Calendar.getInstance();

        alarmCalendar.set(Calendar.HOUR_OF_DAY, _hourOfDay);

        alarmCalendar.set(Calendar.MINUTE, _minute);

        alarmCalendar.set(Calendar.SECOND, 0);

        alarmCalendar.set(Calendar.MILLISECOND, 0);

        if(am_pm.equals("AM"))
        {
            alarmCalendar.set(Calendar.AM_PM, 0);
        }
        else
        {
            alarmCalendar.set(Calendar.AM_PM, 1);
        }


        alarmCalendar.set(Calendar.DAY_OF_WEEK, a);

        Long alarmTime = alarmCalendar.getTimeInMillis();

        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
                alarmTime, 24 * 60 * 60 * 1000 , pendingIntent);
    }

    Toast.makeText(ActivityReminder.this, "Meeting Reminder Set on Week Days (Mon-Fri)", 
                        Toast.LENGTH_LONG).show();
}
最后在清单中:

<receiver android:name="com.my_package_name.AlarmReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
</receiver>

我哪里做错了。如果您有任何帮助,我们将不胜感激。

请查看页面,并查看setRepeating()中的注释。从API 19开始,重复函数是不精确的。要获得正确的重复,您必须每次处理警报并重新安排时间。

我假设警报只设置为周五9:15?这应该是因为AlarmManager文档中有以下行:

如果已经为相同的目的安排了报警,则会首先取消报警。
,long,long,android.app.pendingent)

为了做你想做的事情,你要么想要5个挂起的帐篷,要么只是为第一个事件设置一个警报,当收到警报时,你就为第二天设置警报,以此类推


我可能会选择第二种方法,因为在第一种方法中,您需要5个不同的PendingEvents,这意味着它们的请求代码或支持意图必须不同(具有不同的类型、操作或类别)。

试试这段代码,它对我有用…

    for (int k = 2; k < 5; k++) {
                    int sday = k;
                    Calendar today = Calendar.getInstance();
                    Calendar AlarmDate = Calendar.getInstance();
                    AlarmDate.set(Calendar.HOUR_OF_DAY, inputH);
                    AlarmDate.set(Calendar.MINUTE, inputM);
                    AlarmDate.set(Calendar.SECOND, 0);
                    while (today.after(AlarmDate)) {
                        AlarmDate.add(Calendar.DAY_OF_MONTH, 1);
                    }
                    while (AlarmDate.get(Calendar.DAY_OF_WEEK) != sday) {
                        AlarmDate.add(Calendar.DAY_OF_MONTH, 1);
                    }

                    Intent i = new Intent(this, AlertPopUpActivity.class);
                    i.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
                    i.putExtra("uid", k + (alert.getId() * 1000)); //a unique id for alram
                    i.putExtra("id", alert.getId());
                    i.putExtra("msg", alert.getEventName());

                    if (minute < 10)
                        i.putExtra("time", hour + ":0" + minute);
                    else
                        i.putExtra("time", hour + ":" + minute);
                    i.putExtra("ampm", inputAMPM);
                    PendingIntent pi = PendingIntent.getActivity(this,
                            k + (alert.getId() * 1000), i,         //same unique id (used to update alram if canceled)
                            PendingIntent.FLAG_UPDATE_CURRENT);

                    am.set(AlarmManager.RTC_WAKEUP, AlarmDate.getTimeInMillis(), pi);
                    System.out.println("Set Time :" + AlarmDate.getTime());
                }
for(int k=2;k<5;k++){
国际标准日=k;
Calendar today=Calendar.getInstance();
Calendar AlarmDate=Calendar.getInstance();
AlarmDate.set(Calendar.HOUR\u OF_DAY,inputH);
AlarmDate.set(Calendar.MINUTE,inputM);
AlarmDate.set(日历秒,0);
而(今天。之后(报警日期)){
AlarmDate.add(Calendar.DAY/月,1);
}
while(AlarmDate.get(Calendar.DAY/周)!=星期四){
AlarmDate.add(Calendar.DAY/月,1);
}
意向i=新意向(此为AlertPopUpActivity.class);
i、 添加标志(意图、标志、活动、重新排序、到前端);
i、 putExtra(“uid”,k+(alert.getId()*1000));//alram的唯一id
i、 putExtra(“id”,alert.getId());
i、 putExtra(“msg”,alert.getEventName());
如果(分钟<10)
i、 putExtra(“时间”,小时+”:0“+分钟);
其他的
i、 putExtra(“时间”,小时+:“+分钟);
i、 putExtra(“ampm”,inputAMPM);
PendingEvent pi=PendingEvent.getActivity(此,
k+(alert.getId()*1000),i,//相同的唯一id(如果取消,用于更新alram)
PendingEvent.FLAG_UPDATE_CURRENT);
am.set(AlarmManager.RTC_WAKEUP,AlarmDate.getTimeInMillis(),pi);
System.out.println(“设置时间:+AlarmDate.getTime());
}
)首先,对于相同的挂起意图,不能使用for循环,它将取消以前的实例

)解决方案是在警报完成后,通过广播接收器内部的onReceive方法再次设置警报

)下面是一个如何实现这一点的想法,根据您的需求包括其余的代码。我用日历课设置闹钟,在周五跳过两天

void setAlarm() {
    AlarmManager alarmManager = (AlarmManager) context
            .getSystemService(Context.ALARM_SERVICE);
    if (choice.equals("One Time")) {
        alarmManager.set(AlarmManager.RTC_WAKEUP, PERIOD, pendingIntent);

        Toast.makeText(context, "Meeting Reminder Set One Time",
                Toast.LENGTH_LONG).show();
    } else if (choice.equals("Week Days (Mon-Fri)")) {
        Calendar calendar = Calendar.getInstance();
        int day = calendar.get(Calendar.DAY_OF_WEEK);

        switch (day) {
        case Calendar.MONDAY:
            alarmManager
                    .set(AlarmManager.RTC_WAKEUP, PERIOD, pendingIntent);
        case Calendar.TUESDAY:
            alarmManager
                    .set(AlarmManager.RTC_WAKEUP, PERIOD, pendingIntent);
        case Calendar.WEDNESDAY:
            alarmManager
                    .set(AlarmManager.RTC_WAKEUP, PERIOD, pendingIntent);
        case Calendar.THURSDAY:
            alarmManager
                    .set(AlarmManager.RTC_WAKEUP, PERIOD, pendingIntent);
        case Calendar.FRIDAY:
            alarmManager.set(AlarmManager.RTC_WAKEUP, PERIOD * 3,
                    pendingIntent);
        }
    }
}

)对于if-else条件下的“choice”,您可能必须将这些值存储在类似SharedReferences的位置

假设今天是星期一。如果我遵循您的代码,则“切换案例日历.周一”将为真,alarmManager将在周一设置它…很好,但如果第二天在周二呢。如果我不运行应用程序,那么警报将如何通过日历传递。星期二??我想你没有明白我的第二点,当你调用showNotification(主题)时,你需要在广播接收器类中再次设置警报;内部onReceive方法。你不必运行应用程序AlarmManager,它会为你做的。
    for (int k = 2; k < 5; k++) {
                    int sday = k;
                    Calendar today = Calendar.getInstance();
                    Calendar AlarmDate = Calendar.getInstance();
                    AlarmDate.set(Calendar.HOUR_OF_DAY, inputH);
                    AlarmDate.set(Calendar.MINUTE, inputM);
                    AlarmDate.set(Calendar.SECOND, 0);
                    while (today.after(AlarmDate)) {
                        AlarmDate.add(Calendar.DAY_OF_MONTH, 1);
                    }
                    while (AlarmDate.get(Calendar.DAY_OF_WEEK) != sday) {
                        AlarmDate.add(Calendar.DAY_OF_MONTH, 1);
                    }

                    Intent i = new Intent(this, AlertPopUpActivity.class);
                    i.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
                    i.putExtra("uid", k + (alert.getId() * 1000)); //a unique id for alram
                    i.putExtra("id", alert.getId());
                    i.putExtra("msg", alert.getEventName());

                    if (minute < 10)
                        i.putExtra("time", hour + ":0" + minute);
                    else
                        i.putExtra("time", hour + ":" + minute);
                    i.putExtra("ampm", inputAMPM);
                    PendingIntent pi = PendingIntent.getActivity(this,
                            k + (alert.getId() * 1000), i,         //same unique id (used to update alram if canceled)
                            PendingIntent.FLAG_UPDATE_CURRENT);

                    am.set(AlarmManager.RTC_WAKEUP, AlarmDate.getTimeInMillis(), pi);
                    System.out.println("Set Time :" + AlarmDate.getTime());
                }
void setAlarm() {
    AlarmManager alarmManager = (AlarmManager) context
            .getSystemService(Context.ALARM_SERVICE);
    if (choice.equals("One Time")) {
        alarmManager.set(AlarmManager.RTC_WAKEUP, PERIOD, pendingIntent);

        Toast.makeText(context, "Meeting Reminder Set One Time",
                Toast.LENGTH_LONG).show();
    } else if (choice.equals("Week Days (Mon-Fri)")) {
        Calendar calendar = Calendar.getInstance();
        int day = calendar.get(Calendar.DAY_OF_WEEK);

        switch (day) {
        case Calendar.MONDAY:
            alarmManager
                    .set(AlarmManager.RTC_WAKEUP, PERIOD, pendingIntent);
        case Calendar.TUESDAY:
            alarmManager
                    .set(AlarmManager.RTC_WAKEUP, PERIOD, pendingIntent);
        case Calendar.WEDNESDAY:
            alarmManager
                    .set(AlarmManager.RTC_WAKEUP, PERIOD, pendingIntent);
        case Calendar.THURSDAY:
            alarmManager
                    .set(AlarmManager.RTC_WAKEUP, PERIOD, pendingIntent);
        case Calendar.FRIDAY:
            alarmManager.set(AlarmManager.RTC_WAKEUP, PERIOD * 3,
                    pendingIntent);
        }
    }
}