2010-05-21 5 views
36

Ich versuche, einige Alarme zu machen, nachdem der Benutzer etwas mit einer Zeit aus einer Liste auswählt und eine Benachrichtigung für die angegebene Zeit erstellt. Mein Problem ist, dass der "angezeigteame", dass ein putExtra auf meinem Intent nicht am Broadcast-Empfänger empfangen werden kann. Es wird immer Nullwert erhalten. Dies ist die Art und Weise, wie ich es für die meisten meiner Absichten mache, aber ich denke dieses Mal, vielleicht wegen des pendingIntent oder BroadcastReceivers, muss etwas anders gemacht werden. DankeGetExtra von Intent gestartet von einem pendingIntent

Die Funktion, die die Absicht durch die anhängige Absicht

public void setAlarm(String showname,String time) { 

    String[] hourminute=time.split(":"); 
    String hour = hourminute[0]; 
    String minute = hourminute[1]; 
    Calendar rightNow = Calendar.getInstance(); 
    rightNow.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hour)); 
    rightNow.set(Calendar.MINUTE, Integer.parseInt(minute)); 
    rightNow.set(Calendar.SECOND, 0); 
    long t=rightNow.getTimeInMillis(); 
    long t1=System.currentTimeMillis(); 

    try { 

    Intent intent = new Intent(this, alarmreceiver.class); 
    Bundle c = new Bundle();    
    c.putString("showname", showname);//This is the value I want to pass 
    intent.putExtras(c); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 12345, intent, 0); 

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    alarmManager.set(AlarmManager.RTC_WAKEUP, rightNow.getTimeInMillis(),pendingIntent); 
    //Log.e("ALARM", "time of millis: "+System.currentTimeMillis()); 
    Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show(); 

    } catch (Exception e) { 
     Log.e("ALARM", "ERROR IN CODE:"+e.toString()); 
    } 
} 

Und das ist das Empfangsende

public class alarmreceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    // Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show();  
    Bundle b = intent.getExtras(); 
    String showname=b.getString("showname");//This is where I suppose to receive it but its null 
    NotificationManager manger = (NotificationManager) context 
      .getSystemService(context.NOTIFICATION_SERVICE); 

    Notification notification = new Notification(R.drawable.icon, 
      "TVGuide Υπενθύμιση", System.currentTimeMillis()); 
    PendingIntent contentIntent = PendingIntent.getActivity(context, 0, 
      new Intent(context, tvguide.class), 0); 

    notification.setLatestEventInfo(context, "Το Πρόγραμμα Ξεκίνησε", 
      showname, contentIntent); 

    notification.flags = Notification.FLAG_ONLY_ALERT_ONCE; 

    notification.sound = Uri.parse("file:///sdcard/dominating.mp3"); 
    notification.vibrate = new long[]{100, 250, 100, 500}; 
    manger.notify(1, notification); 
}   
} 

Antwort

23

Intents wiederverwendet wird in dem System sendet, sofern sie nicht vom Kontext unterscheiden/Aktion glaube ich. Documentation Link. Das heißt, wenn Sie bereits eine Absicht erstellt haben, kann diese Absicht später auch verwendet werden.

Als Debug-Test könnten Sie versuchen, intent.setAction("" + Math.random()) unter intent.putExtras(c) hinzuzufügen und sehen, ob Ihre Extras auf der anderen Seite empfangen werden.

Relevante Dokumentation:

Aufgrund dieses Verhaltens ist es wichtig zu wissen, wann zwei Intents betrachtet sind die gleichen für die Zwecke der Abfrage eines PendingIntent zu sein. Ein häufiger Fehler, den Menschen machen, besteht darin, mehrere PendingIntent-Objekte mit Intents zu erstellen, die sich nur in ihren "zusätzlichen" Inhalten unterscheiden, wobei sie jedes Mal einen anderen PendingIntent erwarten. Das passiert nicht. Die Teile der Absicht, die für den Abgleich verwendet werden, sind dieselben, die von Intent.filterEquals definiert sind. Wenn Sie zwei Intent-Objekte verwenden, die äquivalent nach Intent.filterEquals sind, erhalten Sie für beide den gleichen PendingIntent.

+2

Dies ist die richtige Antwort ......... – Necronet

+1

+1, das ist die richtige Antwort, sollte es akzeptiert werden.Es ist wirklich nützlich, Thx. (Übrigens können Sie beim Erstellen von ausstehenden Absichten auch einen anderen Anforderungscode verwenden, mit einem Hash, das ist sehr praktisch). – Snicolas

50

Wenn Sie den Wert des Extra in der Absicht ändern, sollten Sie beim Erstellen der ausstehenden Absicht das Flag PendingIntent.FLAG_CANCEL_CURRENT verwenden.

wäre ein einfaches Beispiel

PendingIntent pi = PendingIntent.getBroadcast(context, 0,intentWithNewExtras,PendingIntent.FLAG_CANCEL_CURRENT); 

Dies ist der richtige Weg sein, und wird dafür sorgen, dass Ihre neuen Werte geliefert werden.

Ich hoffe, es hilft.

+0

Dies scheint nicht in einem Widget mit Flipper zu funktionieren. Sobald eine Absicht gestartet wurde, versucht das System, es erneut zu verwenden, und es wird kein Extra geändert. – Necronet

+3

Arbeitete für mich, ich war stundenlang fest! – Ali

+3

Das Problem von 2 Stunden gelöst .... –

9

Verwenden Sie unterschiedliche Anforderungscodes für verschiedene Alarmmeldungen, um das Überschreiben derselben Alarmzeit zu vermeiden.

+0

Dies ist die beste Antwort für diese Art von Fragen! Sehr einfache und schöne Abhilfe für ein Problem. –

+0

Ich stimme zu, schön einfache Abhilfe. – jp36

0

Sie sollten intent.putExtra() Methode verwenden. Nicht gesetztes Bundle zum Extras-Segment. Wenn Sie eine Zeichenkette setzen, können Sie dies tun intent.putExtra(<key>, value); Versuchen Sie dies wird es getan werden. Ich benutzte es.

0

Ich hatte dasselbe Problem. Ich habe es gelöst, indem ich eine Aktion auf Absicht gesetzt habe, wie von @aioobe hier vorgeschlagen, und meine Absicht wirkt wie eine Magie.

Hier ist, was ich tat

` intent.putExtra("Name", mName); 
    intent.putExtra("dateTime", newdate); 
    intent.setAction("" + Math.random());` 

Hoffe, dass es jemand helfen, glücklich Codierung ..! :)

Verwandte Themen