Middle
Jaki jest cykl życia usług w Androidzie?
sobes.tech AI
Odpowiedź od AI
Serwis nie ma interfejsu użytkownika i działa w tle. Jego cykl życia jest zarządzany przez trzy główne metody:
onCreate(): Wywoływana po raz pierwszy, gdy serwis jest tworzony. Tutaj wykonywana jest inicjalizacja.onStartCommand()/ metoda wywoływana podczas podłączania (np.onBind()):onStartCommand()jest wywoływana podczas uruchomienia serwisu za pomocąstartService(). Zwraca flagę wskazującą, jak system powinien przywrócić serwis, jeśli zostanie zakończony.onBind()jest wywoływana podczas podłączania klienta do serwisu za pomocąbindService().onDestroy(): Wywoływana, gdy serwis jest niszczony. Zwolnione są wszystkie zasoby.
Istnieją dwa typy serwisów wpływających na cykl życia:
- Serwis uruchomiony (Started Service): Uruchamiany przez
startService(). Działa do momentu, gdy zostanie wyraźnie zatrzymany przezstopSelf()lubstopService(). System spróbuje go ponownie uruchomić po zniszczeniu, jeślionStartCommand()zwrócił odpowiedni flagę. - Serwis powiązany (Bound Service): Uruchamiany przez
bindService(). Istnieje tak długo, jak co najmniej jeden aktywny klient jest do niego podłączony. Gdy wszyscy klienci odłączą się, serwis jest niszczony.onBind()zwraca implementacjęIBinder, która jest używana do interakcji z serwisem.
Diagram cyklu życia:
Start Service --+--> onStartCommand() --+--> Uruchomiony
| |
Bind Service ---+--> onBind() -----------+--> Powiązany
|
onCreate() -----+
|
+--> onRebind()
|
onDestroy() <---+-------------------------+---- Odłączony <--- unbindService()
|
+---- Zatrzymany <--- stopSelf() / stopService()
Kluczowe punkty:
onCreate()jest wywoływana tylko raz.onStartCommand()może być wywoływana wielokrotnie, jeślistartService()jest wywoływana wielokrotnie.- Serwis działa w głównym wątku interfejsu użytkownika domyślnie. Długotrwałe operacje powinny być wykonywane w osobnym wątku lub za pomocą
IntentService. - Serwisy powiązane mają bardziej skomplikowany cykl życia, zależny od stanu klientów.
Przykład onStartCommand():
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Wykonaj jakieś działania
// Na przykład, rozpocznij pracę w tle
// Zwróć flagę określającą zachowanie systemu przy niszczeniu serwisu
return START_STICKY; // Serwis zostanie przywrócony, jeśli zostanie zakończony
}
Przykład onBind():
private final IBinder binder = new LocalBinder();
public class LocalBinder extends Binder {
MyService getService() {
// Zwraca instancję serwisu dla klientów
return MyService.this;
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return binder;
}
@Override
public boolean onUnbind(Intent intent) {
// Wywoływana, gdy wszyscy klienci odłączą się
return super.onUnbind(intent);
}