App die ständig Hintergrund wechselt (IntentService)

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

24.04.2014, 16:43:01 via Website

Hallo,

ich habe bisher eine App, die wenn man in der App selbst auf ein Button drückt den Hintergrund wechselt. Vermutlich würde ich es auch schaffen, dass er den alle 10 Minuten oder so wechselt. Aber halt nur wenn die App an ist. Wie funktionieren denn die ganzen Apps bei denen sich der Hintergrund ändert obwohl die App gar nicht an ist. Irgendwann beendet Android doch jede App oder nicht?

— geändert am 24.04.2014, 20:14:58

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

24.04.2014, 16:56:28 via Website

Okay danke werde ich mir anschauen.

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

24.04.2014, 20:10:43 via Website

Ich habe mir jetzt einen IntentService zusammen gebastelt. Gibt es die Möglichkeit den neuzustarten wenn er fertig ist? So sieht der aus:

public class WallpaperSwitch extends IntentService{

boolean links;

public WallpaperSwitch() {
    super("WallpaperSwitch");
    // TODO Auto-generated constructor stub
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // TODO Auto-generated method stub
    return super.onStartCommand(intent, flags, startId);
}

@Override
protected void onHandleIntent(Intent intent) {
    // TODO Auto-generated method stub
    links = intent.getBooleanExtra("Links", true);
    try {
        synchronized (this) {
        wait(dauer);
        if(links){//Da kommt dann alles was ich machen will
        }
        }
    } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
}

Kann man den jetzt wenn der einmal das gemacht hat was ich will einfach von vorne beginnen lassen, also so als würde die onHandleIntent Methode wieder aufgerufen werden?

— geändert am 24.04.2014, 20:18:07

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

24.04.2014, 20:23:14 via Website

Du meinst das ich den Service mit dem Alarmmanager starte? Zumindest hatte ich das gefunden auf der developer Seite:

For example, you could use an alarm to initiate a long-running operation, such as starting a service once a day to download a weather forecast.

Antworten
Michele
  • Forum-Beiträge: 1.525

25.04.2014, 14:11:19 via Website

Mit dem AlarmManager kannst du nach der Zeit die du möchtest, deinen Service Neustarten lassen.

Oder du machst im Service einen Timer mit TimerTask.

LG

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

26.04.2014, 14:03:59 via Website

Was du brauchst ist alles drei : Zeit im AlarmManager einstellen, eine BroadcastReceiver der auf den Alarm Hört, dieser startet einen IntentService. Da das ganze im Hintergrund passiert nimmst du am besten einen WakefulBroadcastReceiver (Ist dort gut erklärt, auf jeden fall am ende des Services den WakefulBroadcastReceiver mit dem Service gestartet wurde wieder deregistrieren damit der Wakelock gelöscht wird).

hth, mac

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

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

27.04.2014, 10:15:14 via Website

Ich habe gemerkt, das es mit einem IntentService leider nicht funktioniert, da mein Service sich immer Daten aus meiner MainActivity holen muss (mit Intent.getExtras). Wenn dann aber die App nicht mehr offen ist und der AlarmManager den IntentService startet, versucht dieser Daten aus der MainActivity zu holen und dann gibts ne NullPointerException. Deswegen verwende ich jetzt einen normalen Service mit return START_STICKY. Dann holt der sich einmal am Anfang die Daten und muss das nicht nochmal machen, wenn dann die App nicht mehr offen ist.

Aber irgendwas verstehe ich noch nicht so ganz:

Mein AlarmManager startet alle 30 Sekunden den Service. Aber der normale Service mit return START_STICKY wird doch immer wieder wiederholt. Das heißt der läuft meine Methoden durch ändert einmal den Hintergrund und startet dann von vorne. Dann kommt irgendwann der AlarmManager sagt es sind 30 Sekunden vorbei und startet dann nochmal einen Service, der dann wieder die ganze Zeit den Hintergrund ändert? Also laufen dann immer mehr Services?

— geändert am 27.04.2014, 10:17:11

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

27.04.2014, 11:43:26 via Website

Ein Sticky Service lebt halt immer, zumindestens meistens. Alle 30 Sek klingt nach einem echtem Batterie Killer :) Ein IntentService ist ansich das selbe. Wieso kann der Service denn auf eine MainActivity zugreifen ? Das ist vom Software Design Standpunkt ziemlich an dem vorbei wie man Android programmieren sollte. Services leben im Hintergrund und werden evtl durch den Vordergrund gestartet, aber nicht anders herum.Du solltest dein Design überdenken, das problem liegt ja darin das du im Service auf die Main zugreifen musst, ändere das ...

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

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

27.04.2014, 11:54:28 via Website

Ja der Service muss ja nur wenn er gestartet wird auf die Main zugreifen um sich einmal zu holen was er braucht. Wie soll er sonst an die Bilder kommen die er benötigt?

Dann soll er alle 30 Sekunden den Hintergrund ändern. Das geht wie ich es bisher versucht habe mit dem IntentSerive nicht, da der ja immer wieder neu angestoßen werden muss und das geht halt nicht wenn die App nicht offen ist. Deswegen habe ich es jetzt mit den "normalen" Service versucht.

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

27.04.2014, 13:21:34 via Website

Du hast nicht verstanden das der AlarmManager den IntentService via BroadcastReceiver anstoßen kann.

Aber dein Ansatz dadrauf zu spekulieren das die MainActivity immer verfügbar ist ist leider falsch, das System killt Activitys die nicht gebraucht werden. Sobald du ein paar Apps aufmachst oder in den Developer Options sagst das er jede Activty nach dem beenden auch 'killen' soll fällt der Konstrukt auf die Nase. Ich würde mir lieber mal überlegen wie du an Bilder oder die Infos kommst um die Bilder zu laden ohne über die Activity zu gehen.

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

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

27.04.2014, 13:28:16 via Website

Ja doch das der AlarmManager den IntentService immer starten kann habe ich verstanden.

Ja das frage ich mich auch, wie ich das machen kann. Wie soll der Service denn wissen, welche Bilder er nehmen soll, wenn ihm das keiner sagt.

Edit: Kann ich die in meinem InternenSpeicher einfach nummeriert speichern und dann beim Service sagen nimm dir die Bilder die im internen Speicher liegen?

— geändert am 27.04.2014, 14:09:13

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

27.04.2014, 14:33:05 via Website

Ka, im AlarmManager kann man Intents einstellen (PendingIntents und dort Daten hinterlegen), diese dann im IntentService auswerten.

Wo deine Bilder liegen ist ja erstmal Nebensache, irgendwo muss ja die Logik implementiert sein wie er Bilder findet und wie er durch diese iteriert. Ich würde versuchen das ohne UI einfach in den Service zu lagern, dieser kann sich auch gern in den sharedprefs merken welches das letzte Bild war und entsprechend dann das nächste besorgen.

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

Antworten
impjor
  • Forum-Beiträge: 1.793

27.04.2014, 14:56:55 via App

Warum speicherst du nicht die Werte in SharedPreferences oder gibst sie dem Intent des AlarmManagers mit? Generell gilt, dass ein Service nicht zwei mal gleichzeitig läuft. Dein Service muss aber doch gar nicht im Hintergrund laufen: Der AlarmManager startet ihn, der Service setzt das Hintergrundbild neu und fertig. Was mir noch eingefallen ist: Du solltest überlegen, den Service nicht zu starten, wenn der Bildschirm aus ist, da man da ja sowieso keine Veränderung feststellt.

Liebe Grüße impjor.

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

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

28.04.2014, 18:49:20 via Website

Ja ich speichere jetzt in den SharedPrefs welches Bild er nehmen soll mal schauen ob ich das hinkriege ;)

Meinst du mit ELAPSED_REALTIME?

Danke :)

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

29.04.2014, 19:31:03 via App

Ich könnte mir vorstellen, dass die APP die den Hintergrund wechselt Malware enthält. Denn die APP hat die den Zugriff den Hintergrund zu ändern obwohl sie diesen Zugriff höchstwahrscheinlich nicht braucht.

Antworten
impjor
  • Forum-Beiträge: 1.793

29.04.2014, 20:33:26 via App

Jonas Weinhold

Ich könnte mir vorstellen, dass die APP die den Hintergrund wechselt Malware enthält. Denn die APP hat die den Zugriff den Hintergrund zu ändern obwohl sie diesen Zugriff höchstwahrscheinlich nicht braucht.

??
Es geht darum, eine App zu programmieren, die den Hintergrund wechselt. Ich glaube doch, dass sie die Permisson braucht.

@Lars: Ja

— geändert am 29.04.2014, 20:33:49

Liebe Grüße impjor.

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

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

01.05.2014, 17:30:48 via Website

Ja genau ich programmiere die App selbst und hab die permission gesetzt weil ich gedacht hab dass ich die wohl brauch;)

Okay hab ich jetzt geändert danke:)

— geändert am 01.05.2014, 17:32:04

Antworten