Der Service..Fragen dazu

S

Shelly22

Fortgeschrittenes Mitglied
0
Hallo liebes Forum.

Ich frage mich noch immer was der unterschied
im Service zwischen onStart() und onStartCommand() ist?

Und warum geben eine bei onStartCommand()

Code:
return START_STICKY;
zurück?



LG
 
Dazu hier die Entwicklerdoku:
Service | Android Developers

Wie ich finde, sehr gut beschrieben.

Um aber deine Frage direkt zu beantworten:

Die Methoe "onStart()" wird klarer, wenn man sich dem Lebenszyklus einer Activity visuell anschaut. Die "onCreate()" Methode wird zu aller erst aufgerufen und daraufhin die Methode "onStart()". Das bedeutet bei Methode "onStart()" ist die Activity für den User bereits sichtbar.


Die "onStartCommand()" wird bei jedem Service-Aufruf von Dir oder von einem AlarmManager aufgerufen und führte letztendlich die Operationen des Services durch.

Das bedeutet, hier gehört der Code rein, der beim Serivce laufen soll.

Der Rückgabewert "ON_STICKY" sagt dem System aus, dass wenn das Smartphone aus Speichergründen deinen Service "killen" muss, der Service vom System erneut gestartet wird ohne das Du dich darum kümmern musst.

Das heißt, es ist eine gewisse "Sicherheit" das Dein Service ständig laufen wird und falls doch nicht, vom Betriebssystem neu gestartet wird (dann allerdings kriegst du als "Intent"-Parameter null übergebenen)

Dann gibt es noch den Rückgabewert "START_NOT_STICKY". Dieser ist z.B. für Services relevant, die alle 15 Minuten laufen (mit Alarmmanager). Hier ist es ja nicht zwingend notwendig, dass das System den Service neustartet wenn dieser aus irgendwelchen Gründen vom Betriebssystem gestoppt wird. Und genau das macht der Rückgabewert: Das System startet den Service nicht automatisch neu!

Um beim Beispiel zu bleiben: Wenn der Service sowieso alle 15 Minuten läuft, dann ist es nicht notwendig, dass das Betriebssystem den Service automatisch neustartet da er ja sowieso in den nächsten Minuten gestartet wird (vom Alarmmanager).
 
Hallo Max.

Danke dir sehr für die gute erklärung.
Mein English ist noch nicht so gut. Deswegen konnte ich mit der Entwicklerdoku
nichts anfangen. Neben der Programmierung lerne ich noch English.

Und was ist dann mit START_STICKY? Ist es nicht das gleiche wie ON_STICKY?

In meiner Test App laufen 1-2 Service. Die werden alle 30-1stunde vom AlarmManager und BroadcastReceiver gestartet.
Also sollte ich da lieber "START_NOT_STICKY" eintragen?


LG
 
Shelly22 schrieb:
Hallo Max.

Danke dir sehr für die gute erklärung.
Mein English ist noch nicht so gut. Deswegen konnte ich mit der Entwicklerdoku
nichts anfangen. Neben der Programmierung lerne ich noch English.

Und was ist dann mit START_STICKY? Ist es nicht das gleiche wie ON_STICKY?

In meiner Test App laufen 1-2 Service. Die werden alle 30-1stunde vom AlarmManager und BroadcastReceiver gestartet.
Also sollte ich da lieber "START_NOT_STICKY" eintragen?


LG

Oh ... "ON_STICKY" gibt es garnicht. Da habe ich mich wohl verschrieben. Ja, das ist genau das: "START_STICKY" was ich damit meinte.

Ja, wenn Du es oder Deine Nutzer verkrafften können, das mal ein Service gestoppt wird und dann nicht mehr läuft bis der AlarmManager einen neuen startet, dann kannst Du "START_NOT_STICKY" verwenden.

Wenn Du jetzt z.B. irgendwelche Sensordaten alle 30 Minuten ausliest und eine große Logik dahinter läuft, würde ich ja erwarten, das wirklich ALLE 30 Minuten Sensorwerte erfasst werden. Sonst passt "START_NOT_STICKY". Verwende ich auch, da ich mir nichts daraus mache, wenn das Betriebssystem meinen Service "killt". :)
 
Hallo Max. Danke nochmal.
Habe nämlich ON_STICKY auch nicht gefunden und mich gewundert was du meintest *grins*

Mein Service sieht so aus nun:


Code:
   @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        Log.d(TAG, "ServiceAgeStartet");

        Intent ageIntent = new Intent(getApplicationContext(), BroadServiceAge.class);
        PendingIntent agePending = PendingIntent.getBroadcast(getApplicationContext(), 0, ageIntent, 0);
        AlarmManager alarmManagerAge = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        Calendar calendarAge = Calendar.getInstance();
        calendarAge.setTimeInMillis(System.currentTimeMillis());
        calendarAge.add(Calendar.SECOND,86400);
        alarmManagerAge.setRepeating(AlarmManager.RTC_WAKEUP, calendarAge.getTimeInMillis(), 0, agePending);

        stopSelf();

        return START_NOT_STICKY;
    }

Er startet jedes mal den BroadcastReceiver und in dem steht mein Code drin.
Ist der Code oder BroadcastReceiver durchgeführt, wird er beendet und start mit:
Code:
        Intent serviceAge = new Intent(context, ServiceAge.class);
        context.startService(serviceAge);

Wieder den Service oben.
Sind alle 24h.

return START_NOT_STICKY; habe ich nun hinzu gefügt.


LG
 

Ähnliche Themen

M
Antworten
2
Aufrufe
631
Mozart40
M
M
Antworten
3
Aufrufe
171
moin
M
S
Antworten
33
Aufrufe
2.676
Sempervivum
S
Zurück
Oben Unten