2011-09-27 13 views
6

Quiero establecer alarma mensual y anual en mi aplicación. Lo hice por semana. AlarmManager.INTERVAL_DAY me ayudó para eso. Pero no pude encontrar una buena manera de implementar la repetición mensual y anual.¿Cómo implementar alarmas de repetición anuales y mensuales?

Buscado hasta ahora:

http://www.satyakomatineni.com/akc/display?url=displaynoteimpurl&ownerUserId=satya&reportId=3503

http://groups.google.com/group/android-developers/browse_thread/thread/9f946e40307073c4?pli=1

hay ninguna otra manera disponible para hacer esto? Cualquier ayuda apreciada.

Respuesta

3

He resuelto el problema. En mi aplicación, las alarmas multipal se establecieron con diferentes intervalos de tiempo de repetición. Así que en mi receptor de difusión para la alarma, reprogramé la alarma según la hora programada para que se repitiera. Utilicé el objeto calendario para agregar el mes y el año de acuerdo y de nuevo configurarlo para el próximo alarm.i código de esta forma utilizar (para la programación que para el próximo mes) -

PendingIntent sender = PendingIntent.getBroadcast(context,Integer.parseInt(Long.toString(id)), intent1, 0);        

Calendar calendar = Calendar.getInstance(); 
calendar.setTimeInMillis(calendar.getTimeInMillis()); 
calendar.add(Calendar.SECOND, 30); 

AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 

calendar.add(Calendar.MONTH, 1); 

am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender); 
+0

He votado negativamente esta respuesta aceptada, porque la respuesta de Laurent es realmente la correcta. –

17

creo que, tiene dos problemas inherentes a este enfoque:

  • AlarmManager no aceptará intervalos de tiempo grandes debido a que el número de Millis se desbordará el argumento

  • No creo Alarmas sobrevivirá el reinicio de su teléfono que seguramente ocurrirá durante un período de tiempo tan largo.

I consejos que almacene cada alarma en un lugar seguro y utiliza una combinación de AlarmManager y ONBOOT receptores para comprobar si una de las alarmas de la lista deben dispararse este mismo día y sólo volver a programar una alarma para despertarse mañana si no hay ninguno.

public class AlarmService extends Service { 
    //compat to support older devices 
    @Override 
    public void onStart(Intent intent, int startId) { 
     onStartCommand(intent, 0, startId); 
    } 


    @Override 
    public int onStartCommand (Intent intent, int flags, int startId){ 
    //your method to check if an alarm must be fired today 
    checkForTodayAlarmsAndBehaveAppropriately(); 

    //reschedule me to check again tomorrow 
    Intent serviceIntent = new Intent(AlarmService.this,AlarmService.class); 
    PendingIntent restartServiceIntent = PendingIntent.getService(AlarmService.this, 0, serviceIntent,0); 
    AlarmManager alarms = (AlarmManager)getSystemService(ALARM_SERVICE); 
    // cancel previous alarm 
    alarms.cancel(restartServiceIntent); 
    // schedule alarm for today + 1 day 
    Calendar calendar = Calendar.getInstance(); 
    calendar.add(Calendar.DATE, 1); 

    // schedule the alarm 
    alarms.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), restartServiceIntent); 
    } 

} 

Para iniciar su servicio en el uso del tiempo de arranque siguiente:

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

public class serviceAutoLauncher extends BroadcastReceiver{ 

@Override 
    public void onReceive(Context context, Intent intent) { 
     Intent serviceIntent = new Intent(context,AlarmService.class); 
     context.startService(serviceIntent); 
    } 

} 

Por último agregar esto a su manifiesto para programar su serviceAutoLauncher que se presentará en cada arranque:

<receiver android:name="serviceAutoLauncher"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED"></action> 
      <category android:name="android.intent.category.HOME"></category> 
     </intent-filter> 
    </receiver> 
+0

Gracias por la response.In rápida mi proyecto, estoy usando un receptor de radio para captar la intención de alarma. No sé cómo puedo saber cuál es la intención de la alarma cuando recibo mi receptor de radiodifusión. ¿Cómo puedo reprogramarlo? ¿Podrías por favor proporcionar algún código de muestra? – Hiral

+0

@Hiral: ver mi edición. –

+0

Parece que el código no funciona. Me sigue diciendo que agregue una declaración de retorno a public int onStartCommand. ¿Algunas ideas? –

3

Para añadir a la respuesta de Laurent. Para resumir desde el cálculo de recurrencia manualmente, sugiero echar un vistazo al this RFC-2445 implementation. Funciona bien en Android y puede ahorrarle mucho dolor.

Cuestiones relacionadas