Sobes.tech
Middle

Android'de servislerin yaşam döngüsü nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Hizmetin bir kullanıcı arayüzü yoktur ve arka planda çalışır. Yaşam döngüsü üç ana yöntemle yönetilir:

  • onCreate(): Hizmet ilk oluşturulduğunda çağrılır. Burada başlatma yapılır.
  • onStartCommand() / bağlanma sırasında çağrılan yöntem (örneğin, onBind()): onStartCommand() startService() ile hizmet başlatıldığında çağrılır. Sistem, hizmetin öldürülmesi durumunda nasıl yeniden başlatılacağını belirten bir bayrak döndürür. onBind() ise bindService() ile hizmete bağlanan bir istemci bağlandığında çağrılır.
  • onDestroy(): Hizmet yok edildiğinde çağrılır. Burada tüm kaynaklar serbest bırakılır.

İki tür hizmet vardır ve bunlar yaşam döngüsünü etkiler:

  • Başlatılan Hizmet (Started Service): startService() ile başlatılır. Açıkça stopSelf() veya stopService() ile durdurulana kadar çalışır. Sistem, onStartCommand() uygun bayrağı döndürdüyse, yok edilmeden sonra yeniden başlatmaya çalışır.
  • Bağlı Hizmet (Bound Service): bindService() ile başlatılır. En az bir aktif istemci bağlı olduğu sürece var olur. Tüm istemciler bağlantıyı keserse, hizmet yok edilir. onBind() bir IBinder uygulaması döndürür ve bu, hizmetle etkileşim için kullanılır.

Yaşam döngüsü diyagramı:

        Start Service --+--> onStartCommand() --+--> Çalışıyor
                        |                         |
        Bind Service ---+--> onBind() -----------+--> Bağlı
                        |
        onCreate() -----+
                        |
                        +--> onRebind()
                        |
        onDestroy() <---+-------------------------+---- Bağlantı Kesildi <--- unbindService()
                                                 |
                                                 +---- Durduruldu <--- stopSelf() / stopService()

Anahtar noktalar:

  • onCreate() sadece bir kez çağrılır.
  • onStartCommand() tekrar tekrar çağrılabilir, eğer startService() tekrar çağrılırsa.
  • Hizmet, varsayılan olarak ana iş parçacığında çalışır. Uzun süren işlemler ayrı bir iş parçacığında veya IntentService kullanılarak yapılmalıdır.
  • Bağlı hizmetlerin yaşam döngüsü daha karmaşıktır ve istemcilerin durumuna bağlıdır.

Örnek onStartCommand():

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // Bir işlem yap
    // Örneğin, arka planda bir işi başlat
    
    // Sistem, hizmet yok edildiğinde nasıl davranacağını belirten bayrağı döndürür
    return START_STICKY; // Hizmet, öldürülürse yeniden başlatılır
}

Örnek onBind():

private final IBinder binder = new LocalBinder();

public class LocalBinder extends Binder {
    MyService getService() {
        // Hizmet örneğini istemcilere döndürür
        return MyService.this;
    }
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return binder;
}

@Override
public boolean onUnbind(Intent intent) {
    // Tüm istemciler bağlantıyı kestiğinde çağrılır
    return super.onUnbind(intent);
}