German B4A: Autostart und "Hintergrundprozess"

Discussion in 'German Forum' started by Kiffi, Apr 9, 2019.

  1. Kiffi

    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
     
  2. DonManfred

    DonManfred Expert Licensed User

    Das funktioniert nicht mit dem starter service! Siehe starter-service tutorial notes.
    android wird deine app killen nehme ich an. Du benötigst einen foreground service.
    Suche nach "Background location tracking"
     
    Kiffi likes this.
  3. Kiffi

    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!
     
  4. MarkusR

    MarkusR Well-Known Member Licensed User

    Extra 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 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
    Code:
    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 StringIntent 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
    Code:
    Sub Service_Start(StartingIntent As Intent)
      
        
    Log("Starter.Service_Start")
          
        
    StartService(Connection)
      
    End Sub
    wichtige Meldung erzeugen
    Code:
    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
    Code:
    Sub StartService_Click
      
        
    StartService(Connection)
      
    End Sub

    Sub StopService_Click
      
        
    StopService(Connection)
      
    End Sub
     
    Kiffi likes this.
  5. Kiffi

    Kiffi Well-Known Member Licensed User

    Hey Markus,

    vielen Dank für Deine Silbertablett-Lösung! [​IMG]

    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 likes this.
  6. MarkusR

    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"
    Code:
    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
    Code:
    Dim Class1 As MyClass
    Class1.Initialize
     
  7. KMatle

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