Modul Plyer - on_pause() und on_resume()

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DMD-OL
User
Beiträge: 317
Registriert: Samstag 26. Dezember 2015, 16:21

Hi
Ich habe eine GPS-App geschrieben, die gestoppt wird, sobald sie in den Pause-Modus versetzt wird (z.B. durch das Ausschalten NUR des Bildschirms).
Ich versuche nun es hinzubekommen, die App 24 h lang laufen zu lassen, damit sie alle 20 s GPS-Daten von einem und denselben Punkt aufnehmen zu lassen.
Aus diesen Daten bilde ich dann den Mittelwert, um genauere Daten zu bekommen.
Ein gutes Beispiel liefert ChatGPT dazu:
""""
In Kivy werden die Funktionen on_pause() und on_resume() verwendet, um mit dem Lebenszyklus der Anwendung umzugehen, insbesondere wenn die App in den Hintergrund verschoben oder pausiert wird. In der Regel musst du nicht zwingend Code in diese Funktionen schreiben, um die App weiterlaufen zu lassen. Stattdessen werden diese Funktionen automatisch aufgerufen, wenn die entsprechenden Ereignisse auftreten.

Wenn du möchtest, dass die App nach einer Pause genau dort weiterläuft, wo sie pausiert wurde, kannst du sicherstellen, dass alle wichtigen Daten und Zustände in der on_pause()-Funktion gespeichert werden und in der on_resume()-Funktion wiederhergestellt werden.

Hier ist ein einfaches Beispiel:

Code: Alles auswählen

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from plyer import notification

class MyApp(App):

    def build(self):
        layout = BoxLayout(orientation='vertical')
        button = Button(text='Zeige Benachrichtigung', on_press=self.show_notification)
        layout.add_widget(button)
        return layout

    def show_notification(self, instance):
        notification.notify(
            title='Meine App',
            message='Hallo, dies ist eine Benachrichtigung von meiner Kivy-App!'
        )

    def on_pause(self):
        # Hier könntest du wichtige Daten speichern
        print("App wird pausiert")
        return True

    def on_resume(self):
        # Hier könntest du gespeicherte Daten wiederherstellen
        print("App wird fortgesetzt")

if __name__ == '__main__':
    MyApp().run()
"""
Was muss in den Funktionen on_pause() und on_resume() stehen, damit die App nicht in den Pause-Modus geschickt und damit gestoppt wird?
Benutzeravatar
noisefloor
User
Beiträge: 3871
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ich kenne mich mit Kivy null aus, aber die Vermutung liegt sehr nahe, dass `on_pause` die Callback-Methode ist, die aufgerufen wird, wenn die App pausiert wird. D.h. alles was drin ausgeführt wird, wird erst aufgeführt, wenn die App bereits pausiert ist. Vielleicht kann du programmatisch darin die Pause aufheben - dann hattest du aber trotzdem eine kurze Pause.

Bzgl. der GPS-Messung: also zu meine Geocachingzeiten habe ich mit meinem Garmin für (ziemlich) genaue Geokoordinaten an 2-3 verschiedenen Tagen so ca. 2-5 Minuten an der gewünschten Position gemessen. Das gab immer ein ziemlich genaues Ergebnis. Bzw. es wurde dann nicht mehr genauer, weil die Genauigkeit der Hardware nicht mehr her gibt. Oder anders: 24h messen ist vielleicht ein bisschen unnötig.

Gruß, noisefloor
Benutzeravatar
Dennis89
User
Beiträge: 1185
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

wir reden hier wieder von Android, auf dem die App läuft?

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
DMD-OL
User
Beiträge: 317
Registriert: Samstag 26. Dezember 2015, 16:21

Okay. Also probiere ich es mal damit, überall gps.start() reinzuballern.
@Dennis89: Ja. Ich übertrage es an mein Handy. Habe aber im Netz gelesen, dass man die GPS-Daten 24 h lang aufnehmen soll, dann den Mittelwert daraus bildet und damit dann eine sehr genaue Lokalisierung erhält. Wenn ich dann den genauen Wert durch den Live-GPS-Wert teile, erhalte ich einen Verbesserungsfaktor. Allerdings für alle Richtungen? D.h. ja dann, falls mir zufällig mal der korrekte Wert sowieso angezeigt
wird, würde ich den ja dann mit dem Faktor wieder ungenauer machen. Soll aber wohl einiges bringen angeblich.
Probieren kann mans ja mal :)
Benutzeravatar
sparrow
User
Beiträge: 4224
Registriert: Freitag 17. April 2009, 10:28

Ich glaube nicht, dass das funktioniert und lese das in der Dokumentation anders.
on_pause wird einmalig ausgeführt, wenn der Zustand geändert wird - also das Programm in den Hintergrund geht. Eben um flüchtige Daten zu speichern und bei on_resume wieder zu laden.

Die Berechtigungen unter Android lassen da auch nur sehr wenig zu. Allerdings bin ich da kein Spezialist. Aber ohne Service wird das gar nicht gehen, nehme ich an.
Benutzeravatar
noisefloor
User
Beiträge: 3871
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Habe aber im Netz gelesen, dass man die GPS-Daten 24 h lang aufnehmen soll, dann den Mittelwert daraus bildet und damit dann eine sehr genaue Lokalisierung erhält.
Wie gesagt: kann ich nicht bestätigen. Mit dem Garmin GPS64 braucht man max 5 min an max 3 verschiedenen Tagen mit aktivertem GPS und GLONASS Empfang, um eine sehr genau Position zu erhalten. Ja nach dem, wie frei die Sicht nach oben ist (=wie viele Satelliten das Gerät sieht) können auch 3min an 2 Tagen halten.

Mit dem Google Pixel 3a damals war das im Prinzip ähnlich, aber die Genauigkeit des Garmin damals war definitiv besser.

Gruß, noisefloor
DMD-OL
User
Beiträge: 317
Registriert: Samstag 26. Dezember 2015, 16:21

@noisefloor: Ich will es später sowieso im Hintergrund laufen lassen. Daher wollte ich das trotzdem auch mal längere Zeit ausprobieren und dann mal mit 2 Minuten vergleichen.
@sparrow: Was MEINST du denn mit "Aber ohne Service wird das gar nicht gehen"?
DMD-OL
User
Beiträge: 317
Registriert: Samstag 26. Dezember 2015, 16:21

Funktioniert. Es reicht natürlich nicht, die Abfrage der GPS-Daten wieder zu starten.
Man muss dann eben auch noch mit kivy.clock aufrufen, dass die Daten wieder gespeichert werden. Diese zweite Zeile fehlte :)
Antworten