2011-09-27 5 views
6

Je veux définir l'alarme mensuelle et annuelle dans mon application.J'ai fait cela pour hebdomadaire. AlarmManager.INTERVAL_DAY m'a aidé pour cela.Mais je ne pouvais pas trouver un bon moyen de mettre en œuvre la répétition mensuelle et annuelle.Comment mettre en place des alarmes récurrentes annuelles et mensuelles?

Cherché jusqu'à présent:

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

Est-ce tout autre moyen disponible pour le faire? Toute aide appréciée.

Répondre

3

J'ai résolu le problème. Dans mon application, les alarmes multipal étaient réglées avec des intervalles de temps différents. Ainsi, dans mon récepteur de diffusion pour l'alarme, j'ai re-programmé l'alarme en fonction de l'heure à laquelle elle devait être répétée.J'ai utilisé l'objet calendrier pour ajouter le mois et l'année et réglez à nouveau pour le prochain alarm.i utilisé le code comme celui-ci (pour la programmation pour le mois prochain) -

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

J'ai downvoted cette réponse acceptée, parce que la réponse de Laurent est la bonne. –

17

Je pense que, vous avez deux problèmes inhérents à cette approche:

  • AlarmManager n'acceptera pas de grands intervalles de temps parce que le nombre de Millis va déborder l'argument

  • Je ne pense pas que les alarmes survivra aux redémarrages de votre téléphone qui se produira très certainement pendant une si longue période de temps.

conseils I que vous stockez chaque alarme dans un endroit sûr et utiliser une combinaison de récepteurs AlarmManager et onboot pour vérifier si une des alarmes de votre liste doit être tiré ce jour-là et juste replanifier une alarme pour se réveiller vous demain si ce n'est pas le cas.

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); 
    } 

} 

Pour démarrer votre service à l'emploi du temps de démarrage ceci:

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); 
    } 

} 

Enfin ajouter à votre manifeste pour planifier votre serviceAutoLauncher être lancé à chaque démarrage:

<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

Merci pour le response.In rapide de mon projet, je me sers d'un récepteur de radiodiffusion pour attraper l'intention d'alarme. Je ne sais pas comment puis-je savoir quelle est l'intention de l'alarme sur réception de mon récepteur de diffusion. Alors, comment puis-je replanifier? Pouvez-vous s'il vous plaît fournir un exemple de code? – Hiral

+0

@Hiral: voir mon édition. –

+0

Le code ne semble pas fonctionner. Il ne cesse de me dire d'ajouter une déclaration de retour à la commande publique onStartCommand. Des idées? –

3

Pour ajouter à la réponse de Laurent. Pour faire abstraction du calcul de la récurrence manuellement, je suggère de jeter un oeil à this RFC-2445 implementation. Cela fonctionne très bien sur Android et peut vous faire économiser beaucoup de douleur.

Questions connexes