android中的多个警报

Posted

技术标签:

【中文标题】android中的多个警报【英文标题】:Multiple alarms in android 【发布时间】:2013-12-03 12:14:01 【问题描述】:

我在 android 中做一个项目,我想创建多天的警报,但问题是当我选择多天时,警报只会在最近一天显示。 这是我的尝试

public void onClick(View v) 
            CheckBox box1=(CheckBox)findViewById(R.id.checkBox1);
            CheckBox box2=(CheckBox)findViewById(R.id.checkBox2);       
            CheckBox box3=(CheckBox)findViewById(R.id.checkBox3);       
            CheckBox box4=(CheckBox)findViewById(R.id.checkBox4);       
            CheckBox box5=(CheckBox)findViewById(R.id.checkBox5);       
            CheckBox box6=(CheckBox)findViewById(R.id.checkBox6);       
            CheckBox box7=(CheckBox)findViewById(R.id.checkBox7);       

            /** Getting a reference to TimePicker object available in the MainActivity */
            TimePicker tpTime = (TimePicker) findViewById(R.id.tp_time);
            int hour = tpTime.getCurrentHour();
            int minute = tpTime.getCurrentMinute();

            Calendar c=Calendar.getInstance();
            int month;
            int day;
            int year;

            Date date =new Date();
            c.setTime(date);

            if(box1.isChecked()) 
                /** This intent invokes the activity DemoActivity, which in turn opens the AlertDialog window */
                Intent i = new Intent("com.example.servicealarmdemo2.demoactivity");
                /** Creating a Pending Intent */
                PendingIntent operation = PendingIntent.getActivity(getBaseContext(), 0, i, Intent.FLAG_ACTIVITY_NEW_TASK);
                c.setTime(date);
                c.set(Calendar.DAY_OF_WEEK,Calendar.MONDAY);


                month=c.get(Calendar.MONTH);
                day=c.get(Calendar.DATE);
                year=c.get(Calendar.YEAR);

                /** Getting a reference to the System Service ALARM_SERVICE */
                AlarmManager alarmManager1 = (AlarmManager) getBaseContext().getSystemService(ALARM_SERVICE);
               /** Creating a calendar object corresponding to the date and time set by the user */
                GregorianCalendar calendar = new GregorianCalendar(year,month,day, hour, minute);

                /** Converting the date and time in to milliseconds elapsed since epoch */
                long alarm_time = calendar.getTimeInMillis();

                /** Setting an alarm, which invokes the operation at alart_time */
                alarmManager1.set(AlarmManager.RTC_WAKEUP  , alarm_time , operation);
                alarmManager1.setRepeating(AlarmManager.RTC_WAKEUP,alarm_time,7*24*3600*1000, operation);
            

            if(box2.isChecked()) 
                Intent i = new Intent("com.example.servicealarmdemo2.demoactivity");
                PendingIntent operation = PendingIntent.getActivity(getBaseContext(), 0, i, Intent.FLAG_ACTIVITY_NEW_TASK);
                c.setTime(date);
                c.set(Calendar.DAY_OF_WEEK,Calendar.TUESDAY);

                month=c.get(Calendar.MONTH);
                day=c.get(Calendar.DATE);
                year=c.get(Calendar.YEAR);                  
                AlarmManager alarmManager2 = (AlarmManager) getBaseContext().getSystemService(ALARM_SERVICE);
                GregorianCalendar calendar = new GregorianCalendar(year,month,day, hour, minute);
                long alarm_time = calendar.getTimeInMillis();
                alarmManager2.set(AlarmManager.RTC_WAKEUP  , alarm_time , operation);
                alarmManager2.setRepeating(AlarmManager.RTC_WAKEUP,alarm_time,7*24*3600*1000, operation);

            

任何帮助将不胜感激

【问题讨论】:

我可能遗漏了什么,但是检查box1box2 有什么区别? 我认为this 可能会回答您的问题。使用相同的PendingIntent 将替换警报。 documentation 中也提到了它 复选框用于我的应用程序检查天数并为选定天数创建警报 好吧,我会删除在选中 box(x) 时处理的部分和 box(y) 之间的共同点,据我所知,这是你的大部分代码:)跨度> How can I setup multiple alarms in Android?的可能重复 【参考方案1】:

在您的代码中PendingIntent

PendingIntent pi = PendingIntent.getActivity(context, **AlarmID**,
                    intent,
                    PendingIntent.FLAG_UPDATE_CURRENT);

// for trigger alarm on day 
 Calendar calendar = Calendar.getInstance();

            calendar.set(Calendar.DAY_OF_WEEK,alarmday);
            calendar.set(Calendar.HOUR, hour);
            calendar.set(Calendar.MINUTE,minute );
            calendar.set(Calendar.AM_PM,am-pm);
            calendar.set(Calendar.SECOND, 0);


                am.setRepeating(AlarmManager.RTC_WAKEUP,
                    calendar.getTimeInMillis(),604800000, pi);

您对所有都使用相同的 AlarmID,因此之前的 alrm 会覆盖我们的不同 alarmId 以用于不同。

【讨论】:

谢谢你我已经改变了它现在部分工作但在选择当天前一天我直接收到警报时仍然有一个错误。所以如果 tdy 是星期二并且我在星期一设置了闹钟我会直接收到警报。对此问题有任何想法吗?那么我应该将所选日期与当前日期进行比较吗? 是的。之前触发的警报,自然会直接触发。因此,您必须验证是否为将来创建了任何新警报。 是的,如果警报是在 setAlarm 时触发的过去时间,那么 Lmickos 是正确的,因此请确保您的警报设置为未来时间.. 好吧,我设法通过将当前日期(以毫秒为单位)与指定日历上设置的闹钟进行比较来解决问题,并在某个时间设置的闹钟大于当前时间时创建闹钟。谢谢为您的回复:)

以上是关于android中的多个警报的主要内容,如果未能解决你的问题,请参考以下文章

Android:未调用的未决意图具有多个警报的打盹

使用警报对话框android的颜色ListView项目

Android:多个警报不起作用

在Android Studio中设置多个警报

如何设置警报与 Android 中的警报应用程序相同?

如何在android中的特定时间和日期获得警报?