【问题标题】:how to set repeating time in setExact() function of alarm manager如何在警报管理器的 setExact() 函数中设置重复时间
【发布时间】:2015-05-14 08:44:35
【问题描述】:

每个人都在这里说将setExact 用于 API 级别 19 及更高级别,但找不到如何在其中设置重复时间,以便在指定时间再次重复。

那么请告诉我如何在setExact方法中设置重复时间?

这是我的代码

 Calendar calendar2,calendar,cal,cal2;
        calendar = new GregorianCalendar();
        calendar2 = new GregorianCalendar();

        calendar2.setTimeInMillis(System.currentTimeMillis());
        calendar.setTimeInMillis(System.currentTimeMillis());


        cal = new GregorianCalendar();
        cal2 = new GregorianCalendar();
        cal.add(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR));
        cal.set(Calendar.HOUR_OF_DAY, 10);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, calendar.get(Calendar.SECOND));
        cal.set(Calendar.MILLISECOND, calendar.get(Calendar.MILLISECOND));
        cal.set(Calendar.DATE, calendar.get(Calendar.DATE));
        cal.set(Calendar.MONTH, calendar.get(Calendar.MONTH));




        AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
        Intent it = new Intent(MainActivity.this,Start_service_alarm.class);

        it.putExtra(Start_service_alarm.ACTION, Start_service_alarm.ACTION);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 987654321, it, 0);
        if(android.os.Build.VERSION.SDK_INT<19)
        {
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
        }else
        {   
            alarmManager.setExact(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingIntent);

        }




        cal2.add(Calendar.DAY_OF_YEAR, calendar2.get(Calendar.DAY_OF_YEAR));
        cal2.set(Calendar.HOUR_OF_DAY, 20);
        cal2.set(Calendar.MINUTE, 0);
        cal2.set(Calendar.SECOND, calendar2.get(Calendar.SECOND));
        cal2.set(Calendar.MILLISECOND, calendar2.get(Calendar.MILLISECOND));
        cal2.set(Calendar.DATE, calendar2.get(Calendar.DATE));
        cal2.set(Calendar.MONTH, calendar2.get(Calendar.MONTH));


        AlarmManager alarmManager2 = (AlarmManager)getSystemService(ALARM_SERVICE);
        Intent itIntent = new Intent(MainActivity.this,Stop_service_alarm.class);

        itIntent.putExtra("ACTION_STOP", Stop_service_alarm.ACTION_STOP);
        PendingIntent pendingIntent2 = PendingIntent.getBroadcast(MainActivity.this, 123456789, itIntent, 0);
        if(android.os.Build.VERSION.SDK_INT<19)
        {
        alarmManager2.setRepeating(AlarmManager.RTC_WAKEUP, cal2.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent2);
        }else

        {
            alarmManager2.setExact(AlarmManager.RTC_WAKEUP, cal2.getTimeInMillis(), pendingIntent2);
        }

【问题讨论】:

  • 处理完再调用这个函数就简单了。为将来设置它。我还没有深入研究 19 API 以上的警报管理器,但是,当我为明天设置警报时 - 我用它来处理某些事情,一旦该过程完成,我再次可以调用 set alarm 方法为明天设置它吗?跨度>
  • @Skynet 我该怎么办?
  • 您在接收警报时会调用什么? - 您必须执行某些操作,例如调用方法或启动服务。现在,当您的服务完成执行时,您可以通过调用 Alarm.setAlarm? 为明天再次设置警报?不能吗?
  • @Skynet 我的服务将在上午 10 点到晚上 8 点之间运行 8 点之后我应该如何设置明天的闹钟
  • 如何在应用程序开始时设置警报?第一次安装?通过调用方法,对吧?

标签: android alarmmanager repeatingalarm


【解决方案1】:

不幸的是,重复的预定时间不准确,我读到它们可能在整个间隔内都不准确!

如果您的 targetSdkVersion 为 19 或更高,则可以。

我可以做些什么来设置精确的重复警报?

使用 setExact() 来控制您的初始延迟。然后,作为处理该事件的工作的一部分,使用 setExact() 在下一个所需时间获得控制权。 IOW,你自己做“重复”的部分。

是的,这很烦人。

引导开发人员不要使用精确的重复警报是故意令人恼火的,因为与不精确的兄弟相比,这些警报对电池来说更糟糕。如果用户会感知到不准确的行为并且不会欣赏它,请随意使用 setExact() 使警报在用户需要时发生。但是,如果用户不会察觉到不精确的行为,请使用不精确的警报,因为用户可能会注意到您的精确警报对电池的影响。

【讨论】:

  • 看来你已经从普通商品中复制了理智的东西,如果你有一些可靠的东西或者我应该做什么或者我应该做重复的部分而不是告诉我
  • 嗨,Edward 根据我理解您在问题中给出的场景,我得到了以下结果:注意:从 API 19 (KITKAT) 开始,警报传递是不准确的:操作系统将转移警报以便尽量减少唤醒和电池使用。有新的 API 来支持需要严格交付保证的应用程序;参见 setWindow(int, long, long, PendingIntent) 和 setExact(int, long, PendingIntent)。 targetSdkVersion 早于 API 19 的应用程序将继续看到以前的行为,即所有警报都在请求时准确传递。
  • 我已经阅读了我提出的问题的所有文件,以获取有关如何执行此操作的代码,而不是任何有关该文件的文档
猜你喜欢
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多