Warum geht der Klick auf die Pushup Notification auf das letzte Datum? (Ich verstehe die Welt nicht mehr)

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Warum geht der Klick auf die Pushup Notification auf das letzte Datum? (Ich verstehe die Welt nicht mehr)

    Hallo,

    ich habe folgenden Codeausschnitt, der nichts anderes macht als Reminder in die Datenbank hinzuzufügen und anschließend für die nächsten 40 Tage Pushupbenachrichtigungen zu generieren. Dies sieht so aus:

    Quellcode

    1. int maxInstances = 40;
    2. while(it.hasNext() && (!rule.isInfinite() || maxInstances-- > 0))
    3. {
    4. org.dmfs.rfc5545.DateTime nextInstance = it.nextDateTime();
    5. // System.out.println("XYZ: " + nextInstance.getDayOfMonth() + " " + nextInstance.getMonth() + " " + nextInstance.getYear());
    6. Calendar newcal_from = Calendar.getInstance();
    7. newcal_from.setTimeInMillis(dtstart);
    8. newcal_from.set(Calendar.DAY_OF_MONTH, nextInstance.getDayOfMonth());
    9. newcal_from.set(Calendar.MONTH, nextInstance.getMonth());
    10. newcal_from.set(Calendar.YEAR, nextInstance.getYear());
    11. long dtstart_new = newcal_from.getTimeInMillis();
    12. if(reminders != null && reminders.size() > 0) {
    13. for(int i = 0; i < reminders.size(); i++) {
    14. if(reminders.get(i) != null) {
    15. ContentValues reminderscontentvalues = new ContentValues();
    16. reminderscontentvalues.put(CalendarContract.Reminders.EVENT_ID, eventID);
    17. reminderscontentvalues.put(CalendarContract.Reminders.METHOD, reminders.get(i).getType());
    18. reminderscontentvalues.put(CalendarContract.Reminders.MINUTES, reminders.get(i).getMinutes());
    19. Uri uri3 = cr.insert(CalendarContract.Reminders.CONTENT_URI, reminderscontentvalues);
    20. int reminderid = Integer.parseInt(uri3.getLastPathSegment());
    21. long scheduletime = dtstart_new - System.currentTimeMillis() - (reminders.get(i).getMinutes() * 60l * 1000l);
    22. if(scheduletime > 0l) {
    23. if(firstidused == false) {
    24. firstidused = true;
    25. }
    26. else {
    27. id = String.valueOf(getInstance(eventID, dtstart_new));
    28. System.out.println("InstanceID: " + id);
    29. }
    30. scheduleNotification(getNotification(title, Long.valueOf(id), dtstart_new), reminderid, scheduletime);
    31. System.out.println("GUT: Title " + title + " " + Long.valueOf(id) + " " + dtstart_new + " " + reminderid + " " + scheduletime);
    32. }
    33. }
    34. }
    35. }
    36. }
    Alles anzeigen





    Die Funktionen scheduleNotification und getNotification sehen so aus:

    Quellcode

    1. private void scheduleNotification(Notification notification, int reminderid, long delay) {
    2. Intent notificationIntent = new Intent(this.c, NotificationPublisher.class);
    3. notificationIntent.putExtra(NotificationPublisher.NOTIFICATION_ID, reminderid);
    4. notificationIntent.putExtra(NotificationPublisher.NOTIFICATION, notification);
    5. PendingIntent pendingIntent = PendingIntent.getBroadcast(this.c, reminderid, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    6. long futureInMillis = elapsedRealtime() + delay;
    7. AlarmManager alarmManager = (AlarmManager)this.c.getSystemService(Context.ALARM_SERVICE);
    8. alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, futureInMillis, pendingIntent);
    9. }
    10. private Notification getNotification(String title, long eventid, long timefrom) {
    11. Calendar cal = Calendar.getInstance();
    12. cal.setTimeInMillis(timefrom);
    13. Notification.Builder builder = new Notification.Builder(this.c);
    14. builder.setContentTitle(title);
    15. builder.setContentText(String.valueOf(DateHelper.singleNumber(cal.get(Calendar.DAY_OF_MONTH)) + "." + DateHelper.singleNumber(cal.get(Calendar.MONTH) + 1) + "." + DateHelper.singleNumber(cal.get(Calendar.YEAR)) + " " + String.valueOf(DateHelper.singleNumber(cal.get(Calendar.HOUR_OF_DAY)) + ":" + DateHelper.singleNumber(cal.get(Calendar.MINUTE)) + " Uhr")));
    16. builder.setSmallIcon(R.mipmap.ic_launcher);
    17. Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    18. builder.setSound(alarmSound);
    19. System.out.println("WidgetPosition: " + new String(String.valueOf(cal.get(Calendar.DAY_OF_MONTH) + "." + cal.get(Calendar.MONTH) + "." + cal.get(Calendar.YEAR)) + "." + String.valueOf(eventid) + "." + timefrom));
    20. Intent i = new Intent(this.c, MainActivity.class);
    21. i.putExtra("widgetposition", new String(String.valueOf(cal.get(Calendar.DAY_OF_MONTH) + "." + cal.get(Calendar.MONTH) + "." + cal.get(Calendar.YEAR)) + "." + String.valueOf(eventid) + "." + timefrom));
    22. PendingIntent contentIntent = PendingIntent.getActivity(this.c, 0,
    23. i, PendingIntent.FLAG_UPDATE_CURRENT);
    24. builder.setContentIntent(contentIntent);
    25. return builder.build();
    26. }
    Alles anzeigen

    Mein Problem ist jetzt folgendes:

    Die erste Pushupnachricht hat ungefähr die Form:

    "Terminkalender
    Name des Termins
    12.12.2017 18:25 Uhr"

    Das klappt also ganz gut.

    Aber dann, wenn ich auf die Pushupnachricht draufklicke, bekomme ich in der App die Variable "widgetposition" (siehe Zeile 26 im zweiten Ausschnitt) als 20.01.2018.[terminid].[zeitinmillisekunden].

    Warum ruft Java den 20.01.2018 auf und nicht den 12.12.2017?

    Im Prinzip mache ich doch mit der Zeile

    Quellcode

    1. builder.setContentText(String.valueOf(DateHelper.singleNumber(cal.get(Calendar.DAY_OF_MONTH)) + "." + DateHelper.singleNumber(cal.get(Calendar.MONTH) + 1) + "." + DateHelper.singleNumber(cal.get(Calendar.YEAR)) + " " + String.valueOf(DateHelper.singleNumber(cal.get(Calendar.HOUR_OF_DAY)) + ":" + DateHelper.singleNumber(cal.get(Calendar.MINUTE)) + " Uhr")));


    und dieser:

    Quellcode

    1. i.putExtra("widgetposition", new String(String.valueOf(cal.get(Calendar.DAY_OF_MONTH) + "." + cal.get(Calendar.MONTH) + "." + cal.get(Calendar.YEAR)) + "." + String.valueOf(eventid) + "." + timefrom));

    Das Gleiche.

    Die Variable wird dann mit

    Quellcode

    1. if(dontshow == false) {
    2. this.datefromwidget = getIntent().getStringExtra("widgetposition");
    3. System.out.println("testÖ: " + this.datefromwidget);
    4. }
    5. if(this.datefromwidget != null) {
    6. System.out.println("Testk: " + this.datefromwidget);
    7. String[] split = datefromwidget.split(Pattern.quote("."));
    8. widgetid = split[3];
    9. widgetdtstart = Long.valueOf(split[4]);
    10. Calendar calen = Calendar.getInstance();
    11. TimeZone tz = calen.getTimeZone();
    12. widgetdtstart = widgetdtstart + tz.getOffset(widgetdtstart);
    13. }
    Alles anzeigen
    abgefangen. Die Ausgabe lautet dann "Tesk: 20.0.2017.[eventid].[timeinmillisekunden]"

    Was falsch ist, ist das 20.0.2017. Die anderen beiden Parameter [eventid].[timeinmillisekunden] stimmen.

    Was mache ich falsch? :)
  • Hallo,

    in der Variable "dtstart_new" steht definitiv die Zeit, an dem der Termin stattfindet.

    Ich finde das Verhalten meines Skripts äußerst mysteriös.

    Ich bekomme in der Pushupbenachrichtigung, das richtige Datum angezeigt (12.12.2017). Das liefert mir der Code:

    Quellcode

    1. builder.setContentText(String.valueOf(DateHelper.singleNumber(cal.get(Calendar.DAY_OF_MONTH)) + "." + DateHelper.singleNumber(cal.get(Calendar.MONTH) + 1) + "." + DateHelper.singleNumber(cal.get(Calendar.YEAR)) + " " + String.valueOf(DateHelper.singleNumber(cal.get(Calendar.HOUR_OF_DAY)) + ":" + DateHelper.singleNumber(cal.get(Calendar.MINUTE)) + " Uhr")));


    Und ein paar Zeilen dadrunter setze ich dann den String, der an meine App übergeben wird:



    Quellcode

    1. i.putExtra("widgetposition", new String(String.valueOf(cal.get(Calendar.DAY_OF_MONTH) + "." + cal.get(Calendar.MONTH) + "." + cal.get(Calendar.YEAR)) + "." + String.valueOf(eventid) + "." + timefrom));


    Dieser ist dann, wenn ich ihn in der MainActivity ausgebe, in der Form 10.0.2018.[instanceid].[timeinmillis]

    Das ist dann das Datum, das in der for-Schleife zuletzt hinzufügt wird.

    Ich verstehe es nicht! Irgendwie ist es für mich schwarze Magie :)

    Ach ja, singleNumber() ist eine statische Methode und macht nichts anderes, als eine 0 hinzufügen, damit die Zahl zweistellig ist. Also zum Beispiel 1 wird zu 01, 5 wird zu 05.
  • Hallo,

    hier ist singleNumber():

    Quellcode

    1. public static String singleNumber(int num) {
    2. if(num >= 0 && num <= 9) return "0" + String.valueOf(num);
    3. else return String.valueOf(num);
    4. }



    Und ich hab eine 1 hinzugefügt und es passiert das gleiche, die App startet am 20.01.2018.

    Hier mal eine Konsolenausgabe:

    Quellcode

    1. 12-12 19:16:10.019 4906-4906/de.ubik.terminkalender I/System.out: WidgetPosition: 12.12.2017.5131.1513108800145
    2. 12-12 19:16:10.022 4906-4906/de.ubik.terminkalender I/System.out: GUT: Title abcd 5131 1513108800145 100 830126
    3. 12-12 19:16:10.038 4906-4906/de.ubik.terminkalender I/System.out: InstanceID: 5132
    4. 12-12 19:16:10.038 4906-4906/de.ubik.terminkalender I/System.out: WidgetPosition: 13.12.2017.5132.1513195200145
    5. 12-12 19:16:10.040 4906-4906/de.ubik.terminkalender I/System.out: GUT: Title abcd 5132 1513195200145 101 87230117
    6. 12-12 19:16:10.057 4906-4906/de.ubik.terminkalender I/System.out: InstanceID: 5133
    7. 12-12 19:16:10.057 4906-4906/de.ubik.terminkalender I/System.out: WidgetPosition: 14.12.2017.5133.1513281600145
    8. 12-12 19:16:10.060 4906-4906/de.ubik.terminkalender I/System.out: GUT: Title abcd 5133 1513281600145 102 173630097
    9. 12-12 19:16:10.077 4906-4906/de.ubik.terminkalender I/System.out: InstanceID: 5134
    10. 12-12 19:16:10.077 4906-4906/de.ubik.terminkalender I/System.out: WidgetPosition: 15.12.2017.5134.1513368000145
    11. 12-12 19:16:10.079 4906-4906/de.ubik.terminkalender I/System.out: GUT: Title abcd 5134 1513368000145 103 260030080
    12. 12-12 19:16:10.095 4906-4906/de.ubik.terminkalender I/System.out: InstanceID: 5135
    13. 12-12 19:16:10.096 4906-4906/de.ubik.terminkalender I/System.out: WidgetPosition: 16.12.2017.5135.1513454400145
    14. ...
    15. 12-12 19:16:10.934 4906-4906/de.ubik.terminkalender I/System.out: InstanceID: 5168
    16. 12-12 19:16:10.934 4906-4906/de.ubik.terminkalender I/System.out: WidgetPosition: 18.1.2018.5168.1516305600145
    17. 12-12 19:16:10.936 4906-4906/de.ubik.terminkalender I/System.out: GUT: Title abcd 5168 1516305600145 137 3197629227
    18. 12-12 19:16:10.967 4906-4906/de.ubik.terminkalender I/System.out: InstanceID: 5169
    19. 12-12 19:16:10.967 4906-4906/de.ubik.terminkalender I/System.out: WidgetPosition: 19.1.2018.5169.1516392000145
    20. 12-12 19:16:10.971 4906-4906/de.ubik.terminkalender I/System.out: GUT: Title abcd 5169 1516392000145 138 3284029191
    21. 12-12 19:16:10.997 4906-4906/de.ubik.terminkalender I/System.out: InstanceID: 5170
    22. 12-12 19:16:10.997 4906-4906/de.ubik.terminkalender I/System.out: WidgetPosition: 20.1.2018.5170.1516478400145
    Alles anzeigen

    Da werden die Pushupnotifikationen generiert.

    Und wenn jetzt die erste angezeigt wird und ich da drauf klicke, bekomme ich in der MainActivity:

    Quellcode

    1. 12-12 19:17:14.545 5119-5119/de.ubik.terminkalender I/System.out: testÖ: 20.1.2018.5170.1516478400145
    2. 12-12 19:17:14.546 5119-5119/de.ubik.terminkalender I/System.out: Testk: 20.1.2018.5170.1516478400145

    Warum wird wird der 20.1.2018 angezeigt!? Ich verstehe es nicht.
  • i.putExtra("widgetposition", new String(String.valueOf(cal.get(Calendar.DAY_OF_MONTH) + "." + cal.get(Calendar.MONTH) + "." + cal.get(Calendar.YEAR)) + "." + String.valueOf(eventid) + "." + timefrom));
    Ist auch nicht richtig zummen gestellt. Du machst das String.valueOf über de gesamten Ausdruck von Monat Tag und Jahr. String.valueOf erstellt dir aus eine Zahl Variablen einen String. Du gibst der Methode aber eine Mischung aus string und int Werten. Dann musstest du das auch für Monat Tag und Jahr separat machen.
    Wobei ich der Meinung bin das du das String.valueOf gar nicht brauchst denn durch den + Operator solle das auch ohne gehen. New String ( "" +Tag +"." +Monat +".".........
    Ein Feedback auf Tipps ist auch schön. :P
  • jogimuc schrieb:

    Wieso machst du die string Erstellung nicht mit simpeldateformat
    Weil ich das Zeitformat brauche.

    Ich habe es abgeändert, ohne String.valueOf, aber es passiert das Gleiche. Heute ruft er den 21. Januar 2018 auf:

    Quellcode

    1. private Notification getNotification(String title, long eventid, long timefrom) {
    2. Calendar cal = Calendar.getInstance();
    3. cal.setTimeInMillis(timefrom);
    4. Notification.Builder builder = new Notification.Builder(this.c);
    5. builder.setContentTitle(title);
    6. builder.setContentText(DateHelper.singleNumber(cal.get(Calendar.DAY_OF_MONTH)) + "." + DateHelper.singleNumber(cal.get(Calendar.MONTH) + 1) + "." + DateHelper.singleNumber(cal.get(Calendar.YEAR)) + " " + DateHelper.singleNumber(cal.get(Calendar.HOUR_OF_DAY)) + ":" + DateHelper.singleNumber(cal.get(Calendar.MINUTE)) + " Uhr");
    7. builder.setSmallIcon(R.mipmap.ic_launcher);
    8. Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    9. builder.setSound(alarmSound);
    10. System.out.println("WidgetPosition: " + cal.get(Calendar.DAY_OF_MONTH) + "." + (cal.get(Calendar.MONTH) + 1) + "." + cal.get(Calendar.YEAR) + "." + eventid + "." + timefrom);
    11. Intent i = new Intent(this.c, MainActivity.class);
    12. i.putExtra("widgetposition", cal.get(Calendar.DAY_OF_MONTH) + "." + (cal.get(Calendar.MONTH) + 1) + "." + cal.get(Calendar.YEAR) + "." + eventid + "." + timefrom);
    13. PendingIntent contentIntent = PendingIntent.getActivity(this.c, 0,
    14. i, PendingIntent.FLAG_UPDATE_CURRENT);
    15. builder.setContentIntent(contentIntent);
    16. return builder.build();
    17. }
    Alles anzeigen



    Und die Daten sind schon richtig, denn ich gebe sie mit "WidgetPosition" aus. Dort erscheint jeweils das zugehörige Datum zu dem Termin. Nur wenn ich draufklicke und die MainActivity starte, dann kommt das falsche Datum.

    jogimuc schrieb:

    12.12.17 plus deine 40 Tage ist der 20.1.18 wahrscheinlich wird dir die letzte Nachricht angezeigt.
    Genau. Aber warum?
  • Hi in wahtsapp wird zb. Auch immer nur die letzte Nachricht aus einen Chat angezeigt. Denke das dies android so will da die Nachrichten ja auch von der selben App kommen. Wenn mehrere Nachrichten da sind wirst du dich selber darum kümmern müssen du Hast sie ja in der DB. Android speichert wohl nur den letzten pandingintent.
    Ein Feedback auf Tipps ist auch schön. :P
  • jogimuc schrieb:

    ja es wird wohl immer die letzte gesendete Nachricht zu erst angezeigt . Last in First Out. Und auch wird wohl der letzte intent zuerst ausgeführt. Was passirt wenn du ein zweites mal auf die Nachricht klickst?
    Werden überhaupt deine 40 Nachrichten angezeigt? Oder nur eine?
    Hallo,

    es ist ein Kalender und es geht um Termine, die sich wiederholen (zum Beispiel täglich). Wenn man die Pushup Nachricht klickt, dann wird der Tag im Kalender angezeigt, an dem der Termin stattfindet und ein Popup wird angezeigt mit dem Termin.

    Wenn ich ein zweites mal auf die Nachricht klicke, passiert das gleiche: Es wird der 21. Januar 2018 aufgerufen, das Popup wird nicht angezeigt.


    jogimuc schrieb:

    Hi in wahtsapp wird zb. Auch immer nur die letzte Nachricht aus einen Chat angezeigt. Denke das dies android so will da die Nachrichten ja auch von der selben App kommen. Wenn mehrere Nachrichten da sind wirst du dich selber darum kümmern müssen du Hast sie ja in der DB. Android speichert wohl nur den letzten pandingintent.


    Hä? Und wie machen es dann andere Kalender? Da gebe ich doch auch mehrere Termine ein und es wird stets der Aktuellste als Pushup Benachrichtigung angezeigt.

    Deine Aussage kann ich nicht nachvollziehen.

    Ich habe mal als kleinen Test mal zwei einfache (sich nicht wiederholenden) Termine eingefügt. Der erste Termin ist um 15:15 Uhr mit 5 Minuten vorher Benachrichtigung und der zweite Termin ist um 15:15 mit 1 Minute vorher Benachrichtigung (in dieser Reihenfolge).

    Was passiert?

    1.) Um 15:14 Uhr erscheint die Benachrichtigung des ersten Termins. Wenn ich drauf drücke wird der Termin richtig angezeigt, nämlich am 13. Dezember 2018.

    2.) Um 15:15 Uhr erscheint die Benachrichtigung des zweiten Termins. Wenn ich drauf drücke wird der Termin falsch angezeigt, es erscheint nämlich der erste Termin.

    Okay, es erscheint logisch. Der zuletzt hinzugefügte Termin wird aufgerufen.

    Wie kann ich das Problem beheben?
  • Hallo, ich habs gelöst:



    Diese Zeile

    Quellcode

    1. PendingIntent contentIntent = PendingIntent.getActivity(this.c, 0,
    2. i, PendingIntent.FLAG_UPDATE_CURRENT);


    wird zu dieser:

    Quellcode

    1. PendingIntent contentIntent = PendingIntent.getActivity(this.c, eventid,
    2. i, PendingIntent.FLAG_UPDATE_CURRENT);

    Man muss dem Request Code eine eindeutige ID übergeben.
  • Hallo zu dem Thema SimpelDateFormat

    das ist dazu da um einen String aus einem zeitstempel zu erzeugen.
    ist einfacher und übersichtlicher als deine Version nur so als Tip.

    Date zeitstempel = new Date();
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
    System.out.println("Datum: " + simpleDateFormat.format(zeitstempel));
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von jogimuc ()