Servisler

► Kısa anlatım

Servisler arka planda çalışan ve herhangi bir kullanıcı arayüzü bulunmayan bir uygulama bileşenidir. Bir uygulama bileşeni bir servis başlatabilir. Kullanıcı başka bir uygulamaya geçiş yapsa bile başlatılan servis çalışmasına devam eder. Ayrıca, bir bileşen bir hizmete bağlanarak işlemler gerçekleştirebilir. Hizmetler arka planda ağ işlemlerini yönetebilir, müzik çalabilir, dosya işlemlerini gerçekleştirebilir ve bir içerik sağlayıcı ile işlem yapabilirler.

Servisler iki farklı yapıda bulunabilir:

Started (Başlatılmış)

Bir uygulama bileşeni startService() metodunu kullanarak bir hizmeti başlattığında, servis başlatılmış olur. Bir kez başlatıldıktan sonra, servisi başlatan bileşen yok edilse bile, servisler arka planda sonsuza kadar çalışabilir. Genellikle, başlatılmış bir servis tek bir işlem gerçekleştirir ve geriye bir sonuç döndürmez. Örneğin ağ üzerinden bir dosya indirme işlemini bitirdiğinde, servis kendi kendini sona erdirir.

Bound (Bağlanılmış)

Bir uygulama bileşeni bindService() metodunu kullanarak bir hizmete bağlandığında, servis bağlanılmış olur. Bağlanılmış bir servis bileşenlerin servis ile iletişim sağlaması, istekler göndermesi, sonuçlar elde etmesi ve karşılıklı iletişim (Interprocess Communication - IPC) ile işlemler gerçekleştirmesi için bir istemci-sunucu arayüzü sağlar. Bağlanılmış servis bir uygulama bileşeni ona bağlı kaldığı sürece çalışmasına devam eder. Aynı zamanda bir servise bağlanan tüm bileşenler bağlantıyı kestiğinde, servis yok edilir.

Bir servis hem başlatılarak sonsuz şekilde hem de bağlanılarak çalıştırılabilir. Bu çift dönüşüm metodu tanımlanması ile ilgili bir durumdur. onStartCommand() meetodu tanımlanırsa bileşenlerin hizmeti başlatması, onBind() metodu tanımlanırsa hizmete bağlanılması sağlanır.

Bir hizmet başlatılmış, bağlanılmış veya her iki özelliğe birden sahip olsa da, herhangi bir bileşen, farklı bir uygulamaya bile ait olsa, servisi kullanabilir. Ancak, manifest dosyasında bir servisi private olarak tanımlayarak diğer uygulamaların erişimlerini engelleyebilirsiniz.

Servis oluşturma

Bir servis oluşturmak için Service sınıfından veya bu sınıftan türetilmiş bir sınıftan bir çocuk sınıf tanımlamanız gerekir. Uygulamalar içinde, bazı dönüşüm metotları için kod yazmanız gerekir. Bu kodlar servislerin yaşam döngüsündeki işlemleri belirler ve bileşenlerin servislere bağlanabilmesi için bir sistem oluşturur:

onStartCommand()

Aktivite gibi bir bileşen startService() komutunu kullanarak bir servisi başlatmak istediğinde, sistem bu metodu çağırır. Bu metod bir kez çalıştıktan sonra, servis başlatılır ve arka planda sonsuza dek çalışır. Bu metodu kullanırsanız, işi bittiğinde stopSelf() veya stopService() komutunu kullanarak servisi sizin sona erdirmeniz gerekir. Eğer servise sadece bağlanmak isterseniz, bu metodu kullamanıza gerek yoktur.

onBind()

Bir bileşen bindService() komutunu kullanarak bir servise bağlanmak istediğinde, sistem bu metodu çağırır. Bu metod için yazdığınız kodlar ile bir IBinder değeri döndürerek istemcilerin servis ile letişim kurabileceği bir arayüz sağlamanız gerekir. Bu metodu daima çalıştırmanız gerekir, ancak bağlanmaya engel olmak isterseniz null bir değer geri döndürmelisiniz.

onCreate()

Bir servis ilk oluşturulduğunda, sistem bu metodu çağırır. Eğer servis zaten çalışıyorsa, bu metod çağrılmaz.

onDestroy()

Bir servis kullanılmadığında ve yok edildiğinde, sistem bu metodu çağırır. Servis thread, kayıtlı dinleyici, alıcı vb. sistem kaynaklarını boşaltmak için bu metodu kullanır.

Manifest dosyası içinde servis bildirimi

Diğer tüm bileşenler gibi servis bildirimlerini de uygulamanızın manifest dosyasında yapmanız gerekir.

Servis bildirimi yapmak için, <application> elemanı altına bir <service> elemanı ekleyin:

<manifest ... >
  <application ... >
      <service android:name=".ExampleService"/>
      ...
  </application ... >
  ...
</manifest>

<service> elemanı içinde servisi başlatmak için gerekli izinler ve servisin içinde çalıştırılacağı uygulamalar gibi özellikler gösteren değerler de tanımlayabilirsiniz. Burada, mutlaka tanımlanması gereken tek özellik servisin sınıf adını gösteren android:name özelliğidir. Uygulamanızı yayınladıktan sonra, bazı işlemler devre dışı kalacağından, bu adı değiştirmemeniz gerekir.

Servisler, farklı uygulamalardaki bileşenlerin intent kullanarak servisleri kullanabilmeleri için intent filtreleri tanımlayayabilir.

Eğer bir servisi sadece kendi uygulamanız içinde kullanmak isterseniz, intent filtre tanımlamanıza gerek yoktur.

Bir servis için herhangi bir intent filtresi tanımlamadığınızda, servisi servis adını gösteren bir intent filtre ile başlatmanız gerekir.

Ayrıca, uygulamanız içinde bir servis için intent filtre tanımlasanız bile, eğer android:exported özelliği ekler ve değerini false olarak ayarlarsanız, servisi programınız dışında bir uygulama kullanamaz.