2010-05-16 7 views
2

J'ai une situation étrange avec AlarmManager. Je planifie un événement avec AlarmManager et transmets une chaîne en utilisant le paramètre intention.putExtra. La chaîne est soit silencieuse ou vibrante et lorsque le récepteur se déclenche, le téléphone doit soit tourner la sonnerie soit mettre le téléphone en mode vibreur. L'instruction de journal affiche correctement la valeur attendue à chaque fois.Intent.putExtras pas cohérent

 Intent intent; 
     if (eventType.equals("start")) { 
      intent = new Intent(context, SReceiver.class); 
     } else { 
      intent = new Intent(context, EReceiver.class); 
     } 
     intent.setAction(eventType+Long.toString(newId)); 
     Log.v("EditQT",ringerModeType.toUpperCase()); 
     intent.putExtra("ringerModeType", ringerModeType.toUpperCase()); 
     PendingIntent appIntent = PendingIntent.getBroadcast(context, 0, 
       intent, 0); 

     AlarmManager alarmManager = (AlarmManager) getSystemService  (Context.ALARM_SERVICE); 
     alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
       appIntent); 

Le récepteur qui se déclenche lorsque l'alarme exécute a également une déclaration de journal et je peux voir la première fois que l'instruction émet la chaîne attendue soit SILENT ou VIBRATE mais pour chaque exécution ultérieure, la sortie indique la valeur d'origine à la fin du récepteur. L'alarme s'exécute, puis je change la valeur de putExtra en chaîne opposée et le récepteur affiche toujours l'événement de valeur précédente bien que l'appel du code ci-dessus montre que la nouvelle valeur a été transmise. La valeur de setAction est la même à chaque fois.

audioManager = (AudioManager) context.getSystemService(Activity.AUDIO_SERVICE); 
Log.v("Start",intent.getExtras().get("ringerModeType").toString()); 
if (intent.getExtras().get("ringerModeType").equals("SILENTMODE")) { 
audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT); 
} else { 
audioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE); 
} 

Des pensées?

Répondre

7

Votre question a été posée six hours ago.

Si vous avez plusieurs PendingIntents en même temps avec des figurants différents, vous aurez besoin de faire varier quelque chose d'autre dans la Intents, comme la chaîne d'action ou Uri, comme décrit dans le lien ci-dessus à émettre.

Si vous n'en avez qu'un seul PendingIntent à la fois, mais que votre extra peut varier, il suffit d'utiliser FLAG_UPDATE_CURRENT lors de votre appel au getBroadcast().

+0

Est-ce que cela veut dire que même si l'intention est survenue dans le passé, le système sait encore à ce sujet? – JDM

+0

Cela semble fonctionner tant que le téléphone n'est pas éteint et redémarré. Si cela se produit et que l'intention est appelée à nouveau à l'aide de FLAG_UPDATE_CURRENT, l'événement n'est pas planifié. Existe-t-il un moyen de vérifier si l'intention existe dans son état actuel? – JDM

+0

"Cela signifie-t-il que même si l'intention s'est produite dans le passé, le système est toujours au courant?" Oui, sauf si vous utilisez 'FLAG_ONE_SHOT'. "Y at-il un moyen de vérifier si l'intention existe dans son état actuel?" Non, mais essayez 'FLAG_CANCEL_CURRENT' ou' FLAG_ONE_SHOT' à la place, puis, selon la façon dont vous essayez d'utiliser 'PendingIntents'. – CommonsWare

1

PendingIntents multiples:

Intent notificationIntent = new Intent(this, Oconf.class); 
notificationIntent.setData(Uri.parse("text")); 

Ensuite, onNewIntent (intention d'intention):

String text = intent.getData().toString(); 
Questions connexes