German Frage zur Benachrichtigungen / Code

pucki

Active Member
Licensed User
Longtime 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
 

MarkusR

Well-Known Member
Licensed User
Longtime User
Hmm, also eine lokale Datenbank.
Als Auslöser der Datenbankabfrage z.B. StartServiceAt
StartServiceAt (Service As Object, Time As Long, DuringSleep As Boolean)
B4X:
StartServiceAt(SQLService, DateTime.Now + 30 * 1000, false) '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:

pucki

Active Member
Licensed User
Longtime 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
 

MarkusR

Well-Known Member
Licensed User
Longtime 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.
 

pucki

Active Member
Licensed User
Longtime User
So er läuft aber er reagiert nicht. ;( WARUM, was mach ich trottel falsch.


B4X:
#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
 

MarkusR

Well-Known Member
Licensed User
Longtime 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.
 

Attachments

  • Trigger.zip
    9.7 KB · Views: 351
Last edited:

pucki

Active Member
Licensed User
Longtime User
Anbei ein Beispiel Projekt.
Aber die spannende Frage ist nun wie der Service der Zeit gesteuert startet weiß warum er startet ..

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.

Anbei ein Beispiel Projekt.
Und man kann wohl nur eine (die nächste) Zeitplanung eintragen.

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

Anbei ein Beispiel Projekt.
Wenn man eh nur eine Zeit nutzen kann dann kann man ja die Info dazu in eine variable bei Process_Globals merken.
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
 

DonManfred

Expert
Licensed User
Longtime User

ilan

Expert
Licensed User
Longtime User
ich glaube nicht das noti eine globale variabel sein soll.

versuch mal so:

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

Well-Known Member
Licensed User
Longtime User
... Es funktioniert zu 90 % ...
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.
B4X:
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.
B4X:
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:

pucki

Active Member
Licensed User
Longtime User
Das hier ist der complete Code des Service-Modul.

B4X:
#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
 

MarkusR

Well-Known Member
Licensed User
Longtime User
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.
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?
 

pucki

Active Member
Licensed User
Longtime 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
 

MarkusR

Well-Known Member
Licensed User
Longtime User
setzte mal noch das icon, ohne kam bei mir ein Fehler
B4X:
noti.Icon = "icon"
und versuche mal
B4X:
noti.AutoCancel = False

Im Manifest Editor habe ich SDK 26 genutzt. (das muss natürlich auch installiert sein)
B4X:
android:targetSdkVersion="26"/>
 

pucki

Active Member
Licensed User
Longtime 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

Well-Known Member
Licensed User
Longtime User
Ich denke immer mehr das meine alte B4A 7.3 das nicht mehr zusammenbekommt.

Könnte sein.
Ja - Angebot abwarten und Lizenz mit +2 Jahre Updates sind nützlich.
 
Top