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:






    Die Funktionen scheduleNotification und getNotification sehen so aus:



    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


    Code
    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:


    Code
    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


    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:


    Code
    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:




    Code
    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():


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



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


    Hier mal eine Konsolenausgabe:



    Da werden die Pushupnotifikationen generiert.


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


    Code
    12-12 19:17:14.545 5119-5119/de.ubik.terminkalender I/System.out: testÖ: 20.1.2018.5170.1516478400145
    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 +".".........

  • 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:




    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.

    12.12.17 plus deine 40 Tage ist der 20.1.18 wahrscheinlich wird dir die letzte Nachricht angezeigt.

    Genau. Aber warum?

  • 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?

  • 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.

  • 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.



    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

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


    wird zu dieser:


    Code
    PendingIntent contentIntent = PendingIntent.getActivity(this.c, eventid,
                    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));

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!