German Frage zur Benachrichtigungen / Code

Discussion in 'German Forum' started by pucki, Jun 11, 2019.

  1. pucki

    pucki Active Member Licensed User

    Hallo Leute

    ich brauche mal ein bischen Hilfe für eine eigendlich einfach Aufgabe, deren Technik ich aber noch nicht so durchblicke.

    Folgendes Problem.

    Ich habe eine Datenbank mit 3 Feldern, ID, DATUM, und Text.

    Nun möchte ich das ein Programm diese Datenbank abfragt, und wenn ein Eintrag (oder mehrere Einträge) mit den aktuellen Datum drin steht, mir eine Benachrichtigung anzeigt. Wie üblich in der obersten Zeile von Android.
    Wenn ich da drauf klicke, soll er mit ein Prg. zeigen, wo ich die Einträge sehe, die Benachrichtigung soll gekillt werden, und eine neue "mögliche" Benachtrichtigung soll erstellt werden.

    Das mit den Datenbanken bekommt ich hin. Nur wie bringe ich das Prg. dazu mir am passenden Tag eine Benachrichtigung zu schicken.

    Das ganze hat viel gemeinsam mit einer Kalender-App. Allerdings muss ich da alles eintragen. Die oben erwähnte Datenbank wird alle 14 Tage automatisch erstellt, dann von mir auf das Tablett copiert.

    Ich weiss das ich frech bin und dumm, aber es würde mich sehr freuen, wenn mir mal einer der Plan hat den passenden Code-Schnipsel codiert. Und ja ich habe Klaus seine Anleitung gelesen, aber irgendwie kein Durchblick. ;(


    Vielen vielen Dank

    Gruß

    Pucki
     
  2. MarkusR

    MarkusR Well-Known Member Licensed User

    Hmm, also eine lokale Datenbank.
    Als Auslöser der Datenbankabfrage z.B. StartServiceAt
    StartServiceAt (Service As Object, Time As Long, DuringSleep As Boolean)
    Code:
    StartServiceAt(SQLService, DateTime.Now + 30 * 1000false'will start after 30 seconds.
    Datum suchen geht über eine SQL Where Bedingung.
    https://www.sqlite.org/lang_datefunc.html

    Einfache Benachrichtigung.
    Üblicherweise geht ein Activity Fenster auf wenn man auf so eine Benachrichtigung klickt.
    https://www.b4x.com/android/help/core.html#notification

    NB6 - Notifications Builder class
    https://www.b4x.com/android/forum/threads/nb6-notifications-builder-class-2018.91819/

    Das DB kopieren könntest Du vielleicht per FTP machen.
    https://www.b4x.com/android/help/net.html#ftp
    Gibt kostenlose FTP Server Software. Müßte bei Windows 10 evtl. schon dabei sein.
    Snap_2019.06.12_13h02m49s_001_.png
     
    Last edited: Jun 12, 2019
  3. pucki

    pucki Active Member Licensed User

    Danke für die Infos. Sie sind sehr hilfreich lösen aber das eigendliche Problem nicht.

    Ich versuche es mal andersrum zu erklären.

    Ich habe diverse Apps auf meine Tablett. Und fast JEDE von ihnen kann mir eine Benachrichtigung schicken.

    Was ich möchte ist, eine Benachrichtigung von meiner App zu einen bestimmten Zeitpunkt zu bekommen. Also der liest in der Datenbank "12.06.2019 10:00 Uhr" und soll um genau diese Zeit eine Benachrichtigung abschicken. Dann den Eintrag löschen, und ein neuen Eintrag holen. Wenn keiner mehr da ist, einfach keine Benachritigung schicken.

    Ich kenne mich mit Datenbank-Abfragen perfekt aus, aber ich hab 0 Ahnung wie man diese Benachrichtigungen programmiert. Die App soll nämlich dabei NICHT wirklich laufen, sondern nur so als Hintergrund-Task. Tun die Spiele ja auch nicht, die mich nerven ;)

    Wie schon erwähnt, ähnlich wie die Kalender-App.

    Gruß

    Pucki
     
  4. MarkusR

    MarkusR Well-Known Member Licensed User

    du kannst einen x beliebigen service mit dem befehl oben starten zu einer zeit und dann erstellst du diese notification.

    klick man dann auf die benachrichtigung geht das fenster dazu auf.
     
  5. pucki

    pucki Active Member Licensed User

    So er läuft aber er reagiert nicht. ;( WARUM, was mach ich trottel falsch.


    Code:
    #Region  Service Attributes
        
    #StartAtBoot: true
        
    #End Region

    Sub Process_Globals
        
    'These global variables will be declared once when the application starts.
        'These variables can be accessed from all modules.
        
        
    'Dim my_sql As SQL
        
         
    Dim noti As Notification
    End Sub

    Sub Service_Create
        noti.Initialize
        
    Log("my_service create")
    End Sub


    Sub Service_Start (StartingIntent As Intent)
        
    Log("my_Service rennt")
        
    Dim my_date, my_time As String
        
    DateTime.DateFormat = "dd/MM/yyyy"
        
    DateTime.TimeFormat = "HH:mm:ss"
        my_date =
    "12/06/2019"
        my_time =
    "17:24:00"
        
        
    DateTime.DateTimeParse (my_date, my_time)
        
    StartServiceAt(""DateTime.DateTimeParse (my_date, my_time), False)
        noti.SetInfo(
    "Pay-TV-Prg","Es liegt eine Information vor",Main)
    End Sub

    Sub Service_Destroy
        
    Log("my_Service put")
    End Sub


    Ich hoffe mir kann einer helfen. Ich bin langsam mit meinen Ideen am Ende.

    Gruß

    Pucki
     
  6. MarkusR

    MarkusR Well-Known Member Licensed User

    Anbei ein Beispiel Projekt.
    Aber die spannende Frage ist nun wie der Service der Zeit gesteuert startet weiß warum er startet ..
    Und man kann wohl nur eine (die nächste) Zeitplanung eintragen.
    Wenn man eh nur eine Zeit nutzen kann dann kann man ja die Info dazu in eine variable bei Process_Globals merken.
     

    Attached Files:

    Last edited: Jun 12, 2019
  7. pucki

    pucki Active Member Licensed User

    Muss er nicht wissen, weiß ja ich. ;) Es reicht völlig als Text das es Zeit ist eine neue Programmierung vorzunehmen. Dann klicke ich darauf und das PRG wird angezeigt wo drin steht was ich machen muss.

    Reicht völlig. Immer eine nach der anderen. ;)

    Hatte ich mir auch so vorgestellt.

    Und VIELEN DANK FÜR DEINE HILFE. Dein Mini-Prg. hat mir sehr geholfen. Es funktioniert zu 90 % perfekt. Nur ein seltsamen Effekt habe ich . Er piest zwar, aber er zeigt NIX in der Benachtigungsliste (Da wo die Uhrzeit steht an). Weist du da vielleicht eine Lösung. Ich dachte der zeigt da den Spruch an ""Pay-TV-Prg","Es liegt eine Information vor". Dann klicke ich da drauf, starte ein Prg (das den Service erstellt hat) schaue an was ich machen will/soll. Dann soll per Prg. der Service mit einer neuen Zeit-Info neu gestartet werden.

    Ich hoffe doch mal ganz lieb das du dazu eine Lösung hast.

    Gruß

    Pucki
     
    MarkusR likes this.
  8. DonManfred

    DonManfred Expert Licensed User

    Ich weiss nicht was der code machen soll. Eine Notification erstellen/ZEIGEN tut er nicht. Da fehlt auf jedenfall ein Notify...

    Ich empfehle Dir erstmal mit der NB6 Class zu arbeiten und zu verstehen, wie Notififactions funktionieren. NB Class ist lauffähig auf allen Android Versionen.
    https://www.b4x.com/android/forum/threads/nb6-notifications-builder-class-2018.91819/
     
  9. ilan

    ilan Expert Licensed User

    ich glaube nicht das noti eine globale variabel sein soll.

    versuch mal so:

    Code:
    Sub Service_Start (StartingIntent As Intent)
        
    Log("my_Service rennt")
        
    Dim my_date, my_time As String
        
    DateTime.DateFormat = "dd/MM/yyyy"
        
    DateTime.TimeFormat = "HH:mm:ss"
        my_date =
    "12/06/2019"
        my_time =
    "17:24:00"
        
        
    DateTime.DateTimeParse (my_date, my_time)
        
    StartServiceAt(""DateTime.DateTimeParse (my_date, my_time), False)
        
        
    Dim noti As Notification
        noti.SetInfo(
    "Pay-TV-Prg","Es liegt eine Information vor",Main)
        noti.Notify(
    1)

    End Sub
     
    MarkusR likes this.
  10. MarkusR

    MarkusR Well-Known Member Licensed User

    Klingt doch schon gut :)

    Screenshot_20190613-074731.png
    das war dieser Teil im Trigger Service.
    Bei Klick sollte das Activity geöffnet werden was Du in SetInfo2 angegeben hast, statt
    "Main" kannst Du auch ein anderes Activity dort angeben.
    Code:
    Sub Service_Start (StartingIntent As Intent)
        
    Service.StopAutomaticForeground 'Call this when the background task completes (if there is one)

        
    Dim noti As Notification
        noti.Initialize2(noti.IMPORTANCE_HIGH)
        noti.AutoCancel = 
    True
        noti.Light = 
    True
        noti.Sound = 
    True
        noti.Vibrate = 
    True
        
    Dim id As Int = 123
        noti.Icon = 
    "icon"
        noti.SetInfo2(
    "Pay-TV-Prg","Es liegt eine Information vor",id,Main)
        noti.Notify(
    id)
     
    End Sub
    im Activity kann man noch den Tag auslesen wenn man SetInfo2 benutzt hat.
    Code:
    Sub Activity_Resume
        
    Dim in As Intent
        
    in = Activity.GetStartingIntent
        
    If in.HasExtra("Notification_Tag"Then
            
    Log(in.GetExtra("Notification_Tag")) 'Will log the tag
            Label1.Text = in.GetExtra("Notification_Tag")
        
    End If
    End Sub
     
    Last edited: Jun 13, 2019
  11. pucki

    pucki Active Member Licensed User

    Das hier ist der complete Code des Service-Modul.

    Code:
    #Region  Service Attributes
        
    #StartAtBoot: true
        
    #End Region

    Sub Process_Globals
        
    'These global variables will be declared once when the application starts.
        'These variables can be accessed from all modules.
        
        
    'Dim my_sql As SQL

        
    Dim noti As Notification
        
    Dim noti_id  As Int
        
    Dim noti_status As String
        
    End Sub

    Sub Service_Create
        
    Log("my_service create")
        
        noti_id = 
    1
        noti.Initialize
        
        noti.AutoCancel = 
    True
        noti.Light = 
    True
        noti.Sound = 
    True
        noti.Vibrate = 
    True
            
        
    Service.StopForeground (noti_id)
        
    Log("my_Service cerate")
        
    Dim my_date, my_time As String
        
    DateTime.DateFormat = "dd/MM/yyyy"
        
    DateTime.TimeFormat = "HH:mm:ss"
        my_date =
    "13/06/2019"
        my_time =
    "22:21:00" ' liegt immer in der Zukunft
        
        
    DateTime.DateTimeParse (my_date, my_time)
        
    StartServiceAt(""DateTime.DateTimeParse (my_date, my_time), False)
        noti_status = 
    "create"
        
    End Sub


    Sub Service_Start (StartingIntent As Intent)
        
    If noti_status = "create" Then
            noti_status = 
    "go"
        
    Else
            noti.SetInfo2(
    "Pay-TV-Prg","Es liegt eine Information vor",noti_id,Main)
            noti.Notify(noti_id)
            
    Log("my_Service start")
            
    Service.StopForeground (noti_id)
        
    End If
    End Sub

    Sub Service_Destroy
        
    Log("my_Service put")
    End Sub
    Er funktioniert AKUSTISCH hervorragend. Nur leider bekomme ich nicht das schöne Bildchen von MarkusS angezeigt. In der Leiste da oben rüht sich NIX.
    Entweder ich habe einen Fehler gemacht, oder ich muß ganz lange sparen. Der Grund dafür ist, das ich aus finanziellen Gründen noch mit der B4A Version 7.3 arbeite.

    Manfred sein Hinweis auf NB6 habe ich versucht einzulesen, aber da fliegen mir die Fehlermeldungen ("kenn ich nicht") um die Ohren und er mekert schon meine 7.3 an.

    Ich frage mich nur, wie das vor 7.3 funktioniert hat.

    Trotzdem Danke für eure Hilfe.

    Gruß

    Pucki
     
  12. MarkusR

    MarkusR Well-Known Member Licensed User

    Beim gesperrten oder entsperrten Bildschirm?
    Bei meinem Beispiel Projekt kommt auch keine Info nach 30 Sekunden?
    Haste evtl. die Benachrichtigungseinstellungen im Gerät verändert?
     
  13. pucki

    pucki Active Member Licensed User

    Dein Projekt kann ich nicht starten. Wegen der 7.3.

    Der Bildschirm ist egal. Ich höre bei Auslösung der Benachrichtigungs-ton. Aber KEIN Meldung.

    Gruß

    Pucki
     
  14. MarkusR

    MarkusR Well-Known Member Licensed User

    setzte mal noch das icon, ohne kam bei mir ein Fehler
    Code:
    noti.Icon = "icon"
    und versuche mal
    Code:
    noti.AutoCancel = False
    Im Manifest Editor habe ich SDK 26 genutzt. (das muss natürlich auch installiert sein)
    Code:
    android:targetSdkVersion="26"/>
     
  15. pucki

    pucki Active Member Licensed User

    Ich habe alle deine Vorschläge getestet. Lt. Debugger funktioniert es. Am Gerät aber nicht.

    Ich habe das SDK 29 drauf (auf den PC;) ). Ich denke (hoffe) das das abwärtskompaktibel mit den 26 ist.
    Aber auf den Tablett ist Andorid 8.1 Samsung exp. Version 9.5

    Ich denke immer mehr das meine alte B4A 7.3 das nicht mehr zusammenbekommt.

    Also werde ich mal 3 Monate sparen, und mir eine 2 Jahres Lizenz bei Erel holen. Vielleicht git Erel ja ein Sonderangebot in der Zeit ;) Und dann mich wieder mit den Thema beschäftigen. Solange schreibe ich mir eben ein PRG. was ich halt jeden Tag von Hand aufrufen muss. ;( Muss ja hinterher nur noch den Service dafür hinzufügen.



    Danke jedenfalls nochmal für deine Hilfe.

    Gruß

    Pucki
     
    MarkusR likes this.
  16. MarkusR

    MarkusR Well-Known Member Licensed User

    Könnte sein.
    Ja - Angebot abwarten und Lizenz mit +2 Jahre Updates sind nützlich.
     
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice