German B4A: Autostart und "Hintergrundprozess"

Kiffi

Well-Known Member
Licensed User
Hallo,

bin kein Profi in Sachen B4A. Deswegen hier meine Frage:

Ich habe eine App geschrieben, die in regelmäßigen Abständen (alle fünf Minuten) eine von mir geschriebene Webseite aufruft. Wenn die Site bestimmte Daten zurückgibt, soll mir die App das in Form einer Notification melden. Das funktioniert soweit.

Nun möchte ich, dass meine App mit meinem Handy startet (Autostart) und so lange im Hintergrund werkelt, bis ich entweder auf das App-Icon oder die Notification 'klicke'.

In der App selber habe ich im Starter-Service #StartAtBoot auf True gestellt. Ist das die richtige Vorgehensweise für den Autostart?

Wenn mein Handy in den Standby geht (nennt man das so?), dann scheint meine App auch keine Daten mehr abzurufen. Muss ich hierfür auch einen Service haben?

Kann leider kein Testprojekt zu ausprobieren erstellen, weil zu viele Firmeninterna in dem Code vorhanden sind. Werft mir bitte ein paar Suchbegriffe oder Links vor die Füße.

Danke im Voraus & Grüße ... Peter
 

DonManfred

Expert
Licensed User
In der App selber habe ich im Starter-Service #StartAtBoot auf True gestellt
Das funktioniert nicht mit dem starter service! Siehe starter-service tutorial notes.
dann scheint meine App auch keine Daten mehr abzurufen
android wird deine app killen nehme ich an. Du benötigst einen foreground service.
Suche nach "Background location tracking"
 

Kiffi

Well-Known Member
Licensed User
Na, das sieht doch schon mal sehr vielversprechend aus. :)

Danke für den Schubs in die richtige Richtung, Manfred!
 

MarkusR

Well-Known Member
Licensed User
Extra 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 PhoneWakeState1 As PhoneWakeState 'Phone library
    Dim PhoneEvents1 As PhoneEvents
    Dim ToastMessageOnOff As Boolean '<- damit kann man steuern ob die Meldungen angezeigt werden sollen oder nicht

End Sub
B4X:
Sub Service_Start(StartingIntent As Intent)
  
    Log("Connection.Service_Start")
   
    Dim n As Notification
    n.Initialize
    n.Icon="icon"
    n.Sound=False
    n.Light = False
    n.Vibrate = False
    n.SetInfo("Alarm","Listening for a Alarm Message",Main)
    Service.StartForeground(1,n)

    PhoneWakeState1.PartialLock
  
    PhoneEvents1.Initialize("PhoneEvents1")
  
End Sub

Sub Service_TaskRemoved
    'This event will be raised when the user removes the app from the recent apps list.

    Log("Connection.Service_TaskRemoved")
  
    PhoneWakeState1.ReleasePartialLock

End Sub

Sub Service_Destroy

    Log("Connection.Service_Destroy")

    PhoneWakeState1.ReleasePartialLock

End Sub

Sub PhoneEvents1_ConnectivityChanged(NetworkType As String, State As String, Intent As Intent)
  
   Log("PhoneEvents1_ConnectivityChanged")
  
   'NetworkType - WIFI or MOBILE.
   '#State - One of the following values: CONNECTING, CONNECTED, SUSPENDED, DISCONNECTING, DISCONNECTED, UNKNOWN.
  
   If State = "CONNECTED" Then
       If ToastMessageOnOff Then ToastMessageShow("Connectivity Changed, Network Type " & NetworkType,False)

   End If
  
End Sub
aus dem Starter Service meinen Connection Service gestartet damit der startet wenn die App startet
B4X:
Sub Service_Start(StartingIntent As Intent)
  
    Log("Starter.Service_Start")
      
    StartService(Connection)
  
End Sub
wichtige Meldung erzeugen
B4X:
Sub Alarm_Notification(m As Message) '<- jMQTT
  
    Dim n As Notification
    n.Initialize2(n.IMPORTANCE_HIGH)
    n.AutoCancel=True
    n.Icon="icon"
    n.Insistent=True
    n.Sound=True
    n.Vibrate=False
    n.Light=True
    n.SetInfo("Alarm",m.Topic & " " & m.Body,Me)
    n.Notify(1)

End Sub
Start Stop über Menu
B4X:
Sub StartService_Click
  
    StartService(Connection)
  
End Sub

Sub StopService_Click
  
    StopService(Connection)
  
End Sub
 

Kiffi

Well-Known Member
Licensed User
Hey Markus,

vielen Dank für Deine Silbertablett-Lösung!


Habe jetzt auch herausgefunden, warum meine App die Daten nicht abfragt, wenn sie im Hintergrund läuft. Den Timer zum triggern der Abfrage habe ich in der Main-Activity, die pausiert, wenn sie nicht im Vordergrund ist. Dadurch feuert der Timer kein Tick-Event mehr.

Der Timer ist wohl am besten im Service-Modul aufgehoben(?)

Danke nochmal & Grüße ... Peter
 

MarkusR

Well-Known Member
Licensed User
Du kannst auch einen Timer in einer Klasse machen aber deklarieren muß man die Variable in einem Service z.B. in Process_Globals.

Standard Class "MyClass"
B4X:
Sub Class_Globals
 
    Dim Timer1 As Timer
 
End Sub

'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize
 
    Timer1.Initialize("Timer1",1000)
    Timer1.Enabled = True
 
End Sub

Sub Timer1_Tick

    Log("Tick " & DateTime.Date(DateTime.Now) )

End Sub
B4X:
Dim Class1 As MyClass
Class1.Initialize
 

KMatle

Expert
Licensed User
Grundsätzlich kann man sich merken: Activities sind "nur" für die Anzeige gedacht. Alle anderen Funktionen gehören in Services (auch gerne Klassen). Ich nutze diverse (DB, Kommunikation, Fachlichkeit, Verschlüsselung). Damit sind die Teile fast 1:1 wiederverwendbar.
 
Top