Task nur ausführen, wenn Bedingung lange nicht erfüllt ist

  • 14 Antworten
  • Letztes Antwortdatum
docadams

docadams

Erfahrenes Mitglied
23
Hallo,
Wenn ich mein Programm NAVIGON starte, soll ein bestimmter Task ausgeführt werden. Und wenn ich es beende, soll ein anderer ausgeführt werden. Das habe ich schon ganz gut hinbekommen.
Das passiert aber leider auch, wenn ich NAVIGON nur mal kurz in den Hintergrund bringe, ohne es zu beenden. Ideal wäre, wenn der zweite Task, nur ausgeführt wird, wenn NAVIGON beendet wird. Das geht wahrscheinlich nicht.
Deshalb dachte ich, dass der Task nur dann ausgeführt wird, wenn Navigon nach 2 Minuten immer noch im Hintergrund ist.

Ich dachte mir das so: ich nehme mir den zweiten Task als Ausgangstask, warte 2 Minuten, prüfe, ob Navigon im Hintergrund ist, bei nein stoppen ich, bei ja führe ihn aus.
Ich packs aber nicht.

Bei der Gelegenheit, manchmal wird mir das Anlegen eines Ausgangstaks angeboten, manchmal nicht.

Wenn ich mehrere Bedingungen habe, dann nie, aber auch so nicht immer. Wovon hängt das ab? Wie kann man das umgehen?

Viele Grüße
 
Hallo!

Bei der Gelegenheit, manchmal wird mir das Anlegen eines Ausgangstaks angeboten, manchmal nicht.

Das hängt halt davon ab, welchen Kontext du verwendest. Bei einem Event macht ein Ausgangstask halt keinen Sinn.

Wenn ich mehrere Bedingungen habe, dann nie

Falsch. Bei zwei State-Bedingungen kannst du auch einen Ausganstask hinzufügen.

Wie stellst du fest, ob Navigon noch im Hintergrund läuft und wie schaut denn dein Profil momentan aus?


Grüße, Jürgen.
 
Aha, wieder was gelernt.

Wenn ich Navigon wieder vor hole, ist es wieder dort, wo ich es hinter geschoben hatte und es startet nicht neu.
Mein Profil ist die APP Navigon, der Task ist GPS starten, Lautsprecher auf laut, usw. Der Ausgangstask ist der Task, den ich gebaut habe für die Situation, wenn ich unterwegs bin.
 
docadams schrieb:
Wenn ich Navigon wieder vor hole, ist es wieder dort, wo ich es hinter geschoben hatte und es startet nicht neu.

Sorry, den Satz verstehe ich nicht...

Was startet nicht neu?

Das haupte Problem ist doch, festzustellen, ob Tasker Navigon noch im Hintergrund läuft, oder?

Ist dein Handy gerootet?

Grüße, Jürgen.
 
Zuletzt bearbeitet:
Handy ist getötet, Rest ist aber Stock.

Z.B. ich habe zunächst Locus gestartet, um die Fahrt mit zuschneiden.
Dann starte ich Navigon daraufhin startet mein "Navigations-Task". Soweit OK.
Möchte ich irgendwann nach schauen ob Locus mitschneidet, drücke ich die Mitteltaste. Jetzt startet der Ausgangs-Task, was ich aber nicht will.
Hab ich alles gesehen, drücke ich wieder die Mitteltaste um wieder Navigon vor zu holen. Nun startet der Navigations-Task wieder. Während der ganzen Zeit fuhr Navigon im Hintergrund weiter, wie es sein soll.

Dieses zwischenzeitliche Starten des anderen Tasks möchte ich vermeiden, nur weil Navigon nur ein paar Sekunden im Hintergrund war.
 
Hallo,

getötet??? :thumbsup:

Du kannst mit einem Shell-Befehl die Prozess-ID abrufen:

Code:
CheckNavigonProcess (39)
    A1: Wait [ MS:0 Seconds:3 Minutes:0 Hours:0 Days:0 ] 
    A2: Run Shell [ 
          Command:pgrep com.navigon.navigator_checkout_eu40
          Timeout (Seconds):0 
          Use Root:Off 
          Store Output In:%pid 
          Store Errors In:%error 
          Store Result In: 
          Continue Task After Error:On ] 
    A3: If [ %pid Set ]
    A4: Stop [ With Error:Off Task: ] 
    A5: Else 
    A6: Flash [ Text:Navigon beendet... Long:Off ]
Wenn der Prozess existiert, wird %pid gesetzt und du stoppst den Exit-Task.

Wichtig: "Continue Task After Error" bei A2 aktivieren.

Grüße, Jürgen.
 
  • Danke
Reaktionen: docadams und Thadeuz
Sehr cooler Codeschnipsel, für den ich mir spontan auch schon ein paar Anwendungen vorstellen kann. :thumbsup:
Aber mir ist aufgefallen, dass eine Anwendung, die beendet wurde, aber noch in den recent apps sitzt, auch noch eine Process ID hat. Ich habs nur mal kurz mit Chrome getestet, wenns im Hintergrund läuft, wird es als laufend erkannt, soweit korrekt. Wenn ich aber solange die zurück-Taste drücke, bis Chrome schließt, wird es ebenfalls als laufend erkannt. Sobald ich aber die Liste der letzten Apps leere, wirds auch nicht mehr als laufend markiert.
Von daher ne coole Sache zum erkennen, ob eine App noch nicht gestartet ist, aber eher suboptimal zum erkennen, ob eine App auch wirklich beendet wurde.

In dem Fall hier würde ich zum verhindern des Exittasks ganz einfach nach ner Wartezeit prüfen, ob die App wieder im Vordergrund ist und dann entsprechend den Task stoppen oder laufen lassen. Um den Eingangstask zu verhindern dürfte aber die Idee mit der pid gut gehen.
Also ein zusätzliches Profil, das nur schaut, ob die Navigon App im Vordergrund ist:
Code:
Profil: Navigon App
Kontext: Aktive App Navigon
Entry: %Navigon = 1
Exit: %Navigon = 0
Und im Exittask des bestehenden Profils dann entsprechend abfragen:
Code:
Exittask
	A1: Wait [ MS:0 Seconds:0 Minutes:1 Hours:0 Days:0 ] 
	A2: Stop [ With Error:Off Task: ] If [ %Navigon ~ 1 ]
        // ...restlicher Task...
 
  • Danke
Reaktionen: docadams
Hallo!

Aber mir ist aufgefallen, dass eine Anwendung, die beendet wurde, aber noch in den recent apps sitzt, auch noch eine Process ID hat.
Das kommt auf die Anwendung an. Wenn die Navigon-App im Hauptbildschirm mit Zurück-Taste und "Wollen Sie beenden" = Ja geschlossen wird, wird auch der Prozess beendet (soweit ich das getestet habe). Navigon steht aber trotzdem bei den recent apps zur Verfügung und wird dann ggf wieder komplett neu gestartet.

Viele andere Apps haben aber zugegebenermaßen immer noch einen aktiven Prozeß, auch wenn sie vermeintlich beendet wurden. In dem Blitzer-App-Thread wird das ja auch diskutiert.


Man könnte jetzt noch etwas tiefer graben und sich den oom_adj Wert des Prozesses anschauen:

Code:
CheckNavigonProcess (39)
    A1: Wait [ MS:0 Seconds:3 Minutes:0 Hours:0 Days:0 ] 
    A2: Run Shell [ Command:pgrep com.navigon.navigator_checkout_eu40 Timeout (Seconds):3 Use Root:Off Store Output In:%pid Store Errors In:%error Store Result In: Continue Task After Error:On ] 
    A3: If [ %pid Set ]
    A4: Variable Set [ Name:%path To:/proc/%pid/oom_adj Do Maths:Off Append:Off ] 
    A5: Read File [ File:%path To Var:%oom_adj ] 
    A6: Flash [ Text:%oom_adj Long:Off ] 
    A7: Stop [ With Error:Off Task: ] 
    A8: Else 
    A9: Flash [ Text:Navigon beendet... Long:Off ]
Vielleicht kannst du mal testen, ob und wie sich dieser Wert bei Chrome verändert, und ob das nachvollziehbar ist.

Hintergrund:
https://github.com/mcgill-cpslab/mobile-research/wiki/How-Android-manages-background-processes?

Grüße, Jürgen.
 
Ich hab mal ein wenig mit rumgespielt, Chrome scheint tatsächlich keinen Unterschied zwischen Hintergrund und beendet zu machen. Der oom_adj Wert ist in beiden Fällen identisch, bei meinen Tests wars 7. Einmal ist mir wohl während dem Testen der Speicher voll gelaufen, da stieg der Wert auch mal auf 10 an, war aber auf die Schnelle nicht reproduzierbar.
Muss man dann wohl auf App-zu-App-Basis testen, aber solange es beim gegebenen Problem klappt, ists ja wunderbar.
 
  • Danke
Reaktionen: androidkoller
Ok,

ich denke mal, die ganzen Google-Apps und -Services sind da sowieso deutlich hartnäckiger als andere Anwendungen...

Grüße, Jürgen.
 
SVielen dank für eure Hilfe. Ich bin gerade unterwegs, so auf dem Handy kann ich androidkollers Lösung nicht probieren, das muss ich vom Computer ablesen. Tschuldigung. Hole ich nach.

Aber Thadeuzs Lösung möchte ich versuchen.
Nun kommt der Anfänger wieder durch, bitte entschuldigt. Diese A1 A2 sind das nur Schritt 1 Schritt 2?
Und -wie/wo- gebe ich nach Kontext:Aktive App Navigon
das
"Entry: %Navigon = 1
Exit: %Navigon = 0"
ein?
 
Zuletzt bearbeitet:
Und wieder mal war androidkoller schneller als ich. ;)

docadams schrieb:
Und -wie/wo- gebe ich nach Kontext:Aktive App Navigon
das
"Entry: %Navigon = 1
Exit: %Navigon = 0"
ein?
So wie androidkoller es beschrieben hat. Ds war nur meine Art von Tasker-Pseudocode.
 
Aha, der eingangstask ist "setze Variable Navigon auf 1" und der ausgangstask ist "setze sie auf 0"
Und das Frage ich in meinem Ausgangstask ab.
Aber wie rufe/starte ich meine beiden Tasks? Da fehlt doch jetzt der Auslöser?
 
docadams schrieb:
Aber wie rufe/starte ich meine beiden Tasks? Da fehlt doch jetzt der Auslöser?

Na das ist der Kontext: aktive App.
Du machst ein neues Profil und wählst da App -> Navigon. War jetzt aber echt nicht sooo weit her geholt...
 

Ähnliche Themen

G
Antworten
1
Aufrufe
178
bbfh
bbfh
P
Antworten
25
Aufrufe
1.862
Pentatulim
P
joerg-rz
Antworten
6
Aufrufe
999
mbefore305
M
Zurück
Oben Unten