Middle
Ποιο είναι το κύκλος ζωής των υπηρεσιών στο Android;
sobes.tech AI
Απάντηση από AI
Η υπηρεσία δεν διαθέτει UI και λειτουργεί στο παρασκήνιο. Ο κύκλος ζωής της διαχειρίζεται από τρεις βασικές μεθόδους:
onCreate(): Καλείται για πρώτη φορά όταν δημιουργείται η υπηρεσία. Εδώ γίνεται η αρχικοποίηση.onStartCommand()/ μέθοδος που καλείται κατά τη σύνδεση (π.χ.,onBind()): ΤοonStartCommand()καλείται κατά την εκκίνηση της υπηρεσίας με τη μέθοδοstartService(). Επιστρέφει μια σημαία που υποδεικνύει πώς πρέπει να επανεκκινήσει το σύστημα την υπηρεσία αν τερματιστεί. ΤοonBind()καλείται κατά τη σύνδεση του πελάτη με την υπηρεσία μέσω τηςbindService().onDestroy(): Καλείται όταν η υπηρεσία καταστρέφεται. Εδώ απελευθερώνονται όλοι οι πόροι.
Υπάρχουν δύο τύποι υπηρεσιών που επηρεάζουν τον κύκλο ζωής:
- Ξεκινήσιμη Υπηρεσία (Started Service): Ξεκινά με τη μέθοδο
startService(). Λειτουργεί μέχρι να σταματήσει ρητά με τη μέθοδοstopSelf()ήstopService(). Το σύστημα θα προσπαθήσει να την επανεκκινήσει μετά την τερματισμό, αν ηonStartCommand()επέστρεψε την αντίστοιχη σημαία. - Συνδεδεμένη Υπηρεσία (Bound Service): Ξεκινά με τη μέθοδο
bindService(). Υπάρχει όσο τουλάχιστον ένας ενεργός πελάτης είναι συνδεδεμένος. Όταν όλοι οι πελάτες αποσυνδεθούν, η υπηρεσία καταστρέφεται. ΗonBind()επιστρέφει μια υλοποίηση τουIBinder, που χρησιμοποιείται για αλληλεπίδραση με την υπηρεσία.
Διάγραμμα κύκλου ζωής:
Start Service --+--> onStartCommand() --+--> Εκτελείται
| |
Bind Service ---+--> onBind() -----------+--> Συνδεδεμένη
|
onCreate() -----+
|
+--> onRebind()
|
onDestroy() <---+-------------------------+---- Αποσυνδεδεμένη <--- unbindService()
|
+---- Σταματημένη <--- stopSelf() / stopService()
Κύρια σημεία:
onCreate()καλείται μόνο μία φορά.onStartCommand()μπορεί να καλείται πολλές φορές, αν καλείται επανειλημμένα ηstartService().- Η υπηρεσία λειτουργεί στο κύριο νήμα UI από προεπιλογή. Οι μακροχρόνιες λειτουργίες πρέπει να εκτελούνται σε ξεχωριστό νήμα ή με χρήση του IntentService.
- Οι υπηρεσίες με σύνδεση έχουν πιο πολύπλοκο κύκλο ζωής, που εξαρτάται από την κατάσταση των πελατών.
Παράδειγμα onStartCommand():
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Εκτέλεση κάποιων ενεργειών
// Για παράδειγμα, έναρξη εργασίας στο παρασκήνιο
// Επιστροφή σημαίας που καθορίζει τη συμπεριφορά κατά την καταστροφή της υπηρεσίας
return START_STICKY; // Η υπηρεσία θα επανεκκινηθεί αν τερματιστεί
}
Παράδειγμα onBind():
private final IBinder binder = new LocalBinder();
public class LocalBinder extends Binder {
MyService getService() {
// Επιστρέφουμε το στιγμιότυπο της υπηρεσίας για τους πελάτες
return MyService.this;
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return binder;
}
@Override
public boolean onUnbind(Intent intent) {
// Καλείται όταν όλοι οι πελάτες αποσυνδεθούν
return super.onUnbind(intent);
}