【问题标题】:alarmManager setRepeating every Monday, every 1st of every month and 1st of January AndroidalarmManager setRepeating 每周一、每月 1 日和 1 月 1 日 Android
【发布时间】:2016-04-16 13:59:32
【问题描述】:

我每周一、每月 1 日和 1 月 1 日做一个 setRepeating 函数,我每周一都这样做:

 GregorianCalendar date = new GregorianCalendar(); 
while( date.get( Calendar.DAY_OF_WEEK ) != Calendar.MONDAY )
     date.add( Calendar.DATE, 1 );
}
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, date.getTimeInMillis(), 7 * 24 * 60 * 60 * 1000, pendingintentResetAlarms);

我的问题是我不知道每个月的 1 日和 1 月 1 日我该怎么做,因为每个月都有不同的天数。 我需要想法。

谢谢

【问题讨论】:

    标签: android date alarmmanager


    【解决方案1】:

    我认为您可以通过以下方式做到这一点,并每 365 天设置一次闹钟:

    GregorianCalendar date = new GregorianCalendar();
    date.set(Calendar.MONTH, Calendar.JANUARY);
    date.set(Calendar.DAY_OF_MONTH, 1);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, date.getTimeInMillis(), 365 * 24 * 60 * 60 * 1000, pendingintentResetAlarms);
    
    date.set(Calendar.MONTH, Calendar.FEBRUARY);
    date.set(Calendar.DAY_OF_MONTH, 1);  
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, date.getTimeInMillis(), 365 * 24 * 60 * 60 * 1000, pendingintentResetAlarms);
    ...
    

    但是,有一个关于一年有 365 天还是 366 天的问题。那么另一种解决方案可能是避免这种情况并执行以下操作:

    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, date.getTimeInMillis(), 24 * 60 * 60 * 1000, pendingintentResetAlarms);
    

    它每天都会触发警报,在您的广播接收器中,您可以查看当前日期:

    GregorianCalendar date = new GregorianCalendar();
    if(date.get(Calendar.DAY_OF_MONTH) == 1)
       ....
    

    其实我觉得第二种方案更好更健壮

    【讨论】:

    • 感谢您的想法,但对于第二种解决方案,您如何在 date.getTimeInmillis() 中为 setRepeating 配置日期?什么日期.set.... ???
    • @elvega 你可以使用 System.currentTimeMillis() 来获取当前时间
    • 检查是星期一还是 1 月 1 日是???我这样做了:if(date.get(Calendar.DAY_OF_WEEK)==Calendar.MONDAY) 或 if(date.get(Calendar.DAY_OF_MONTH)==1 && date.get(Calendar.MONTH)==Calendar.JANUARY)。我还好吗?
    • @elvega if(date.get(Calendar.DAY_OF_WEEK)==Calendar.MONDAY) || (date.get(Calendar.DAY_OF_MONTH)==1 && date.get(Calendar.MONTH)==Calendar.JANUARY)
    • 闹钟仍然对我不起作用。我的意图是每周一重置数据库的某些值,所以接收者我放了一个更新并将我想要的值归零,但是它不起作用....
    【解决方案2】:

    接收者:

     final BasedeDatos bd = new BasedeDatos(context, "DBSesiones", null, 1);//parametros:contexto,nombre base de datos,
    SQLiteDatabase db = bd.getWritableDatabase();
    
    
    @Override
    public void onReceive(Context context, Intent intent) {
    
        Bundle bundle = intent.getExtras();
        if (bundle != null) {
            boolean bRestAlarms = bundle.getBoolean("ReseteaBBDD", false);
            if (bRestAlarms) {
                //call your subbroutine here
                GregorianCalendar date = new GregorianCalendar();
    
                if(date.get(Calendar.DAY_OF_WEEK)==Calendar.MONDAY){
                    //reseteo tabla semana
                    for(int i=0;i<6;i++) {
                        db.execSQL("UPDATE " + "SesionesSemana" + " SET " + columnas[i] + " = " + 0 + " WHERE " + "_id = 1");
                    }
                } if(date.get(Calendar.DAY_OF_MONTH) == 1){//si es primero de mes
                    //reseteo la tabla meses
                    for(int i=0;i<6;i++) {
                        db.execSQL("UPDATE " + "SesionesMes" + " SET " + columnas[i] + " = " + 0 + " WHERE " + "_id = 1");
                    }
                }
                if(date.get(Calendar.DAY_OF_MONTH)==1 && date.get(Calendar.MONTH)==Calendar.JANUARY){
                    //reseteo la tabla años
                    for(int i=0;i<6;i++) {
                        db.execSQL("UPDATE " + "SesionesAno" + " SET " + columnas[i] + " = " + 0 + " WHERE " + "_id = 1");
                    }
                }
                db.close();
            }
        }
    
    }`
    

    【讨论】:

    • @Pooya 这是我的接收者
    猜你喜欢
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多