Service schaltet sich ab nach einiger Zeit???

  • Antworten:22
Michele
  • Forum-Beiträge: 1.525

29.05.2013, 19:19:16 via Website

Hallo liebes Forum.

Bastel gerade eine App Widget zusammen.

Es läuft ein Service im Hintergrund. Der führt alle 10min ein Timer/TimerTask/Runnable aus.

Das Problem ist, wenn mein Display zulange aus ist geht der Service auch irgendwie aus und der
Timer wird nicht mehr ausgeführt nach 10min. Oder liegt es alleine nur am Timer/TimerTask?
Oder irgendwie wird mein Timer 2x mal gestartet. Also muss der Service 2x gestartet werden vom App Widget.

Gibt es noch was besseres als der Service für den Hintergrundprozess?

So sieht mein TimerTask aus: In dem befindet sich auch noch ein Thread für den sleep();

1public class Action extends TimerTask {
2
3 @Override
4 public void run() {
5
6 Thread thread = new Thread(new Runnable(){
7
8 @Override
9 public void run() {
10
11
12 /// meine Action hier
13
14
15 }
16 });
17 thread.start();
18 }
19 }


LG

— geändert am 29.05.2013, 19:51:12

Antworten
Andy N.
  • Forum-Beiträge: 3.112

29.05.2013, 19:52:09 via App

Ein Service ist eigentlich nicht dafür gedacht. Der sollte eigentlich nur kurz laufen und sich dann wieder abschalten. Man kann auch nicht garantieren, dass er die ganze Zeit läuft.

Dazu kommt, dass man in der Manifest festlegen muß, wenn eine App im Standby die CPU weiter verwenden soll (das gibt es glaub ich auch für WiFi).

Muß der Service wirklich ständig laufen? Was hat der User davon, wenn er am Display nichts sieht?

— geändert am 29.05.2013, 19:53:39

Antworten
Michele
  • Forum-Beiträge: 1.525

29.05.2013, 20:49:59 via Website

Andy N.
Ein Service ist eigentlich nicht dafür gedacht. Der sollte eigentlich nur kurz laufen und sich dann wieder abschalten. Man kann auch nicht garantieren, dass er die ganze Zeit läuft.

Dazu kommt, dass man in der Manifest festlegen muß, wenn eine App im Standby die CPU weiter verwenden soll (das gibt es glaub ich auch für WiFi).

Muß der Service wirklich ständig laufen? Was hat der User davon, wenn er am Display nichts sieht?

Und wie läuft dann z.B die Musik vom MediaPlayer dauerhaft im Hintergrund? Nicht mit dem Service?
Und wie lege ich das fest in der Manifest? Welche befehl?

Ja muss leider ewig laufen. Da es z.B nach ca 10min immer was prüft.

Ich werde es mal mit einem AlarmManger ausstesten der alle 10min den Service Startet und dann sich wieder selbst stopt.
Vielleicht ist das besser als TimerTask und Timer.

Wäre nur super, wenn du mir den Manifest.xml befehl sagen könntest den du meintest.



LG

Antworten
Gelöschter Account
  • Forum-Beiträge: 18

29.05.2013, 21:06:19 via Website

Michele
Andy N.
Ein Service ist eigentlich nicht dafür gedacht. Der sollte eigentlich nur kurz laufen und sich dann wieder abschalten. Man kann auch nicht garantieren, dass er die ganze Zeit läuft.

Dazu kommt, dass man in der Manifest festlegen muß, wenn eine App im Standby die CPU weiter verwenden soll (das gibt es glaub ich auch für WiFi).

Muß der Service wirklich ständig laufen? Was hat der User davon, wenn er am Display nichts sieht?

Und wie läuft dann z.B die Musik vom MediaPlayer dauerhaft im Hintergrund? Nicht mit dem Service?
Und wie lege ich das fest in der Manifest? Welche befehl?

Ja muss leider ewig laufen. Da es z.B nach ca 10min immer was prüft.

Ich werde es mal mit einem AlarmManger ausstesten der alle 10min den Service Startet und dann sich wieder selbst stopt.
Vielleicht ist das besser als TimerTask und Timer.

Wäre nur super, wenn du mir den Manifest.xml befehl sagen könntest den du meintest.



LG

Hi,
da bin ich vor einigen Wochen mal drüber gestolpert. Ob es das ist, was du suchst, weiß ich nicht genau :grin:
http://developer.android.com/reference/android/os/PowerManager.html

-> *If you hold a partial wake lock, the CPU will continue to run, regardless of any display timeouts or the state of the screen and even after the user presses the power button

-> android.permission.WAKE_LOCK

Gruß Mo

Antworten
Michele
  • Forum-Beiträge: 1.525

29.05.2013, 23:26:41 via Website

impjor
Stichpunkt ist hier ForegroundService.

Gruß

Danke dir. Aber das heißt genauer?


LG

Antworten
Michele
  • Forum-Beiträge: 1.525

29.05.2013, 23:38:17 via Website

Ok.
Aber wozu eine Notification?

Die hält doch mein Service nicht am Leben oder?


LG

— geändert am 29.05.2013, 23:40:40

Antworten
Carsten M.
  • Forum-Beiträge: 33.204

29.05.2013, 23:39:20 via App

Die notification ist nicht notwendig.

Herzliche Grüße

Carsten

Ich komm' mir langsam vor wie jemand, der ich bin // #cäthe

Michele

Antworten
Michele
  • Forum-Beiträge: 1.525

29.05.2013, 23:41:26 via Website

Carsten Müller
Die notification ist nicht notwendig.

Herzliche Grüße

Carsten

Ok danke dir. Aber was brauche ich dann nun.
Foreground Service sagt mir nicht viel?


Mir fällt gerade ein. Hält der AsyncTask mein Service nicht am leben?

LG

— geändert am 29.05.2013, 23:41:49

Antworten
impjor
  • Forum-Beiträge: 1.793

29.05.2013, 23:52:44 via App

Carsten Müller
Die notification ist nicht notwendig.
Laut den Docs *muss* der Benutzer benachrichtigt werden, dass eine App dauerhaft an seinem Akku und CPU und RAM saugt, was ja ein Service tut, der nicht von Android beendet werden kann.

Gruß

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Michele
  • Forum-Beiträge: 1.525

30.05.2013, 00:07:38 via Website

impjor
Carsten Müller
Die notification ist nicht notwendig.
Laut den Docs *muss* der Benutzer benachrichtigt werden, dass eine App dauerhaft an seinem Akku und CPU und RAM saugt, was ja ein Service tut, der nicht von Android beendet werden kann.

Gruß

Ach das meinst du damit.

Naja wenn man überlegt das so viele Spiele im Hintergrund weiterlaufen und dich benachrichtigten über das Spiel
aber nicht über den Service der im Hintergrund läuft.

Aber gut zu wissen. Nur jetzt weiß ich leider noch immer nicht wie ich den Service halte.
Finde leider nichts auf Google und http://developer.android.com/reference/android/app/Service.html

EDIT: Eigentlich geht ja mein Service gar nicht aus. Da der Timer und TimerTask dauerhaft laufen und sich wiederholen?
Oder sehe ich das falsch?


LG

— geändert am 30.05.2013, 00:42:41

Antworten
Andy N.
  • Forum-Beiträge: 3.112

30.05.2013, 00:43:02 via App

Mit startForeground. Sollte so auch im Artikel stehen.

Bedenke aber, Android ist ein OS für Mobile Geräte mit begrenzter Akkulaufzeit. Danach wurde auch Android ausgelegt. Überlege erst mal, ob man es nicht auch anders lösen kann.

Ein TimerTask läuft nicht ständig und wird immer wieder neu angestoßen.

— geändert am 30.05.2013, 00:45:41

Antworten
Michele
  • Forum-Beiträge: 1.525

30.05.2013, 00:56:31 via Website

Andy N.
Mit startForeground. Sollte so auch im Artikel stehen.

Bedenke aber, Android ist ein OS für Mobile Geräte mit begrenzter Akkulaufzeit. Danach wurde auch Android ausgelegt. Überlege erst mal, ob man es nicht auch anders lösen kann.

Ein TimerTask läuft nicht ständig und wird immer wieder neu angestoßen.

Ja meinte den Timer sorry. Der Timer zählt ja wieder erneut runter die Zeit bis er auf 0 ist und dann TimerTask ausführt.
Der Timer endet ja erst wenn man ihn selbst stoppt.

1timer.scheduleAtFixedRate(TimerTask task, long delay, long period)

Wie werden denn die Aufbau Spiele wie Simpsons z.B Programmiert?
Da läuft ja auch vieles auf Zeit und man bekommt bescheid, wenn z.B das Haus fertig gebaut ist.
Also läuft doch auch dauerhaft was im Hintergrund.

Nur was? Oder wie? Wie soll ich das sonst machen?

EDIT: Naja das habe ich nun erstmal hinzugefügt.
Das soll antscheinend den Service am leben behalten und auch eine Notification ausgeben.
1Notification notification = new Notification(R.drawable.icon, getText(R.string.ticker_text),
2 System.currentTimeMillis());
3Intent notificationIntent = new Intent(this, ExampleActivity.class);
4PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
5notification.setLatestEventInfo(this, getText(R.string.notification_title),
6 getText(R.string.notification_message), pendingIntent);
7startForeground(ONGOING_NOTIFICATION, notification);


LG

— geändert am 30.05.2013, 01:32:14

Antworten
impjor
  • Forum-Beiträge: 1.793

30.05.2013, 15:14:17 via App

Spiele berechnen einfach voher, dass es eine Stunde z.B. dauert, benachrichtigen dann z.B. den AlarmManager für die Notification.
ob das Haus fertig ist, kann man ja auch ganz leicht ausrechnen, wenn man weiß, wann der Auftrag gestartet wurde.

Gruß

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Michele
  • Forum-Beiträge: 1.525

30.05.2013, 15:27:53 via Website

Aber der AlarmManager läuft ja auch wieder im Hintergrund?

LG

Antworten
Andy N.
  • Forum-Beiträge: 3.112

31.05.2013, 10:23:33 via Website

Es ist aber doch besser einen Service den es eh schon gibt mit zu verwenden, als 100 neue auf zu machen. Zudem ist dieser schon sehr performant (sitzt auch schon in einer tieferen Schicht).

Da diese Spiele nicht selten auf Servern laufen wäre C2DM eine andere Möglichkeit.

— geändert am 31.05.2013, 10:25:43

Antworten
impjor
  • Forum-Beiträge: 1.793

31.05.2013, 11:50:43 via App

Die Frage war doch, wie Spiele funktionieren, bei denen nach einer bestimmten Zeit etwas fertig gestellt ist.
Solche Spiele brauhen keinen Service, der dauernt intern eine Zahl herunterzählt, nur um irgendann zu sagen, die Zahl ist null, also ist das Haus fertig.
Stattdessen werden sie AlarmManager verwenden, der nach einer bestimmten Zeit die Notification ausgegeben soll.
Da muss nicht dauernt ein Service laufen.

Gruß

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

31.05.2013, 12:19:20 via Website

Wäre arg overkill das über einen service zu lösen. Es reicht eigentlich sich Zeitpunkt A zu merken und periodisch zu checken ob Zeitpunkt B eingeretten ist. Sowas passiert gewöhnlich im "Rendering Loop"...

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Andy N.
  • Forum-Beiträge: 3.112

31.05.2013, 12:33:05 via App

Michele hat aber schon recht, dass mit dem Alarm Manager auch ein Service läuft und darauf hab ich mich bezogen.
Nur ist das ein Teil von Android.

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

31.05.2013, 13:29:38 via Website

Na ja,der AlarmManager ist letztendlich CRON der aufgebohrt wurde. Leichtgewichtiger gehts nicht mehr, das macht das System letzendlich. Es kommt auf den Use Case drauf an, Wenn ich ein game habe das 1000 solcher events vergleichen muss und nebenbei 1000 Sprites darstellt sollte ich auf jeden fall etwas nutzen was schnell ist. Ich könnte mir durchaus vorstellen irgendwelche Bäume zu verwenden um festzustellen das ein Event eingetretten ist.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Andy N.
  • Forum-Beiträge: 3.112

31.05.2013, 14:16:58 via Website

Ich denke nicht, dass ein Cron dahinter steckt. Das ist glaub ich ein eigene Umsetzung, ein Android Service, der auf einem Treiber gebunden ist.
Ein Cron würde bei Android wahrscheinlich gar nicht ausgeführt werden.

Antworten
Michele
  • Forum-Beiträge: 1.525

31.05.2013, 14:58:42 via Website

Kompliziert halt alles :*)

Ich muss mindestens 1x Service laufen lassen für die Animation des Widgets, die ich steuern muss.

Anders gehts leider nicht im Widget.


LG

— geändert am 31.05.2013, 15:01:39

Antworten