Posts Tagged Service

Android’le Adım Adım Uygulama Geliştirme – III

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:

  • “Service” sınıfını extend eden bir sınıf hazırlanır
  • Bu sınıf içerisinde “onCreate”, “onStart” ve “onStop” metodları implement edilir
  • Uygulamanın AndroidManifest.xml dosyasında ilgili sınıf “service” tanımı içerisinde belirtilir
  • 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();
    }

    android-bolum3-1_ok

    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:

    android-bolum3-2_ok

    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:

    android-bolum3-3_ok

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

    , ,

    No Comments