Alle 5 Sekunden etwas im Service aufrufen

  • Ich habe aktuell das Problem, dass ich alle 5 Sekunden etwas aufrufen
    möchte, in meiner permanent laufenden Service Klasse. Bis jetzt habe ich
    das mit einem Handler versucht, aber das will einfach nicht:



    public class PermaService extends Service {
    public PermaService () {
    }



    private Handler handler = new Handler();



    @Overridepublic IBinder onBind(Intent intent) {
    Log.i("rnc", "PermaService STARTED");
    handler.postDelayed(runnable, 5000);
    throw new UnsupportedOperationException("Not yet implemented");
    }



    private Runnable runnable = new Runnable() {
    @Overridepublic void run() {
    Log.i("rnc", "PermaService STARTED");
    handler.postDelayed(this, 5000);
    }
    };





    }

  • Mit postDelayed kannst Du kein Intervall starten. Siehe hier: http://ux5.de/4ky6


    Besser ist es, einen eine Schleife laufen zu lassen und am Ende ein Thread.sleep(5000) zu verwenden.


    Seit Android Lillipop gibt es auch den JobScheduler, der solche Aufgaben übernehmen kann. http://ux5.de/4kyu

  • Habe so etwas auch mal als Service geschrieben, aber ohne Thread mit Sleep.
    Habe dazu den AlarmManager genutzt.
    In diesem Beispiel ruft er alle 5 Minuten die onReceive auf


    Die beiden Methoden Repeat und Cancel kann man natürlich auch in die UpdateService Klasse aufnehmen und von da aus starten




  • Habe so etwas auch mal als Service geschrieben, aber ohne Thread mit Sleep.
    Habe dazu den AlarmManager genutzt.
    In diesem Beispiel ruft er alle 5 Minuten die onReceive auf


    Die beiden Methoden Repeat und Cancel kann man natürlich auch in die UpdateService Klasse aufnehmen und von da aus starten



    Welche Rolle spielt denn der Service? Hält er den Timer am leben?
    Denn bis jetzt hatte ich nur Probleme mit dem AlarmManager. Einige Zeit funktioniert er, doch irgendwann hat er einfach aufgehört zu arbeiten. Ohne klaren Grund.


    Aber 1000 * 5 sind doch 5 Sekunden, oder nicht?

  • das du keinen service verwendet hast, ist der grund. Android killt prozesse irgendwann wenn sie nicht mehr im vordergrund sind. Wann ist nicht vorhersehbar, das entscheidet das system nach bedarf. Aspekte die aber an einen Service gebunden sind, werden vom System nicht gekillt.

  • Ja, sind 5 Sekunden, mein Fehler, sry :D
    Habe genau das benutzt in einer App, um Daten von einem Server abzurufen und Notifications eventuell zu erstellen und mit dieser Methode läuft es einwandfrei, auch noch nach Tagen. Das ganze noch mit nem BroadcastReceiver der auf das Starten des Gerätes anspringt und schon ist es auch "Neustart-Sicher" :D
    Der Service läuft ja immer, wird also nicht getötet und kann somit den AlarmManager "verwalten"

  • Ja, sind 5 Sekunden, mein Fehler, sry :D
    Habe genau das benutzt in einer App, um Daten von einem Server abzurufen und Notifications eventuell zu erstellen und mit dieser Methode läuft es einwandfrei, auch noch nach Tagen. Das ganze noch mit nem BroadcastReceiver der auf das Starten des Gerätes anspringt und schon ist es auch "Neustart-Sicher" :D
    Der Service läuft ja immer, wird also nicht getötet und kann somit den AlarmManager "verwalten"

    Habe es nun eine Woche lang getestet. Jedoch wurde der Service nach einige Zeit immer beendet. Selbst START_STICKY bringt nichts und bei onDestroy hilft auch ein sendBroadcast nichts....
    Denn irgendwie scheint das direkte neustarten, durch einen BroadcastReceiver auch nicht immer zu funktionieren.

  • ist der service denn an deine app gebunden?
    ich kann mir vorstellen das android aus memoryleak präventionsgründen ungebundene services nach einer gewissen zeit einfach killt.

    Ich starte den Service aus der App (BroadcastReceiver) heraus, ja. Das habe ich auch gelesen, aber liegt das dann an meinem Handy?

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!