Posts Tagged Service
Android’le Adım Adım Uygulama Geliştirme – III
Posted by Serkan Doğantekin in Android, Genel on May 21st, 2009
Daha önceki iki bölümde döviz değerlerini gösteren basit bir uygulama geliştirmiştik. Ancak uygulamamız gibi düzenli aralıklarla güncellenmesi gereken değerlerinin olduğu uygulamalarda bu tarz güncelleme işlemlerinin kullanıcı etkileşimi olmadan arka planda çalışması beklenmektedir.
Android platformu arka planda çalışması beklenen iş akışları için “Service” altyapısı içermektedir. Bu yapı ile uygulamamız aktif olmasa bile çeşitli işlemlerin gerçekleştirilmesi sağlanabilmektedir. Çalışan service’ler, aktif olmayan/görüntülenmeyen Activity’lere daha yüksek bir önceliğe sahip olduğundan kaynak yönetimi tarafından daha etkin bir şekilde yönetilmektedirler.
Bir “Service” yaratabilmek için gerekli olan adımları 3 grupta toparlayabiliriz:
Bu adımlardan sonra hazırladığımız “Service” tanımını Context.startService ve Context.stopService metodları ile aktif ve pasif hale getirebiliriz.
Bizde uygulamamız için döviz değerlerini alıp, veritabanına aktaran “CurrencyExchangeService” adında “Service” sınıfını extend eden bir sınıf hazırlayalım. Döviz değerlerini alıp, veritabanına aktarmak için “CurrencyExchangeActivity” sınıfındaki “getExchange” metodunu bu sınıf tanımında kopyalayalım (tabi içindeki gereksiz parçaları ayıklayarak).
public class CurrencyExchangeService extends Service { @Override public void onCreate() { super.onCreate(); } @Override public void onDestroy() { super.onDestroy(); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); } @Override public IBinder onBind(Intent intent) { return null; } public void getExchange() { .... } private class CurrencyExchangeHandler extends DefaultHandler { .... } }
Bu “Service” tanımını aktif hale getirmek için ana Activity sınıfımızda “startService(new Intent(this,CurrencyExchangeService.class))” şeklinde bir metod çağrısı yeterli olacaktır. Bu metod ilk defa çağrıldığında “Service” sınıfındaki “onCreate” ve “onStart” metodlarını çalıştıracaktır. Sonraki çağrımlarında ise sadece “onStart” metodunu çalıştırır. Aktif haldeki “Service” tanımını iptal etmek için ise yine ana Activity sınıfımızda “stopService(new Intent(this,CurrencyExchangeService.class))” şeklinde bir metod çağrısı yapmamız yeterli olacaktır. Bu metod ilgili “Service” sınıfında “onStop” metodunu çalıştıracaktır.
Ancak dikkat etmemiz gereken bir nokta, bu şekilde bir kullanımda “Service” sınıfında uygulamanın ana thread’i içinde çalıştığıdır. Mesela “onCreate” metodu içerisinde “getExchange” metodunu çalıştırdığım bir “Service” tanımının çalışması sırasındaki threadleri incelersek:
public void onCreate() { super.onCreate(); getExchange(); }

Uygulamanın ana thread’i içerisinde çalıştığımızdan zaman isteyen işleyişlerde bu uygulamamızın kilitlenmesine neden olabilir.
Bu durumu aşmak için yeni bir thread yaratıp, bu thread içerisinde iş akışını gerçekleştirmeyi deneyebiliriz. Yukarıdaki örnek için bunu şu şekilde gerçekleştirebiliriz:
public void onCreate() { super.onCreate(); Thread workerThread = new Thread(null,new Runnable(){ @Override public void run() { getExchange(); }},"currency_exchange"); workerThread.start(); }
Bu şekilde “Service” tanımını çalıştırıp, threadlerin durumunu incelersek, yeni thread’in yaratıldığını ve iş akışının bu yeni thread içerisinde çalıştırıldığını görebiliriz:

Yada eğer “Service” tanımı içerisinde belirli zaman aralıklarında tekrarlanmasını istediğimiz bir iş akışımız bulunuyor ise Android platformu ile gelen “Timer” sınıfını kullanabiliriz. Bu sınıf kendi içerisinde bir thread kullandığından bizim ekstra bir thread tanımı yapmamıza gerek kalmadan, iş akışımız Timer’a ait thread içerisinde çalışacaktır (Bu thread’i kapatmak için Timer.cancel metodunu kullanabilirsiniz).
public void onCreate() { super.onCreate(); Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { getExchange(); }}, 0, 60*1000); }
Bu şekilde “Service” tanımını çalıştırıp, threadlerin durumunu incelersek, iş akışının Timer’a bağlı thread içerisinde çalıştırıldığını görebiliriz:

Bir sonraki bölümde görüşmek üzere…
Güncel Yorumlar