Android Service Kullanımı ve Service HttpPost-Notificaton

Merhaba arkadaşlar bu dersimizde Android Service kullanımını yapmış olduğum küçük bir uygulama ile de sizlere anlatmaya çalışacağım. Öncelikle Android Service nedir ,ne işe yarar ve Android Activity lerden farkı nedir onlardan bahsetmek istiyorum.

Android Service class lar aslında arayüzü olmayan activity classlardır. Yani herhangi bir xml dosyasına bağlanıp çalışmazlar. Arayüzleri olmadığı için kullanıcı ile herhangibir bağlantıları olmaz.Android işletim sistemi service class lara activitylere göre daha çok öncelik tanır.Cihazın ram sıkıntısı olduğu durumlarda önce activityleri kapatır sonra serviceleri otomatik kapatmaya başlar. Eğer ram sıkıntısı ortadan kalkarsa kapattığı service leri tekrardan açar. Uygulamayı kapattığınızda bile servisler çalışmaya devam edebilir.

Peki ne amaçla kullanılır derseniz benim için iki önemli amacı vardır. Birincisi uygulama açıkken uzun sürecek işlemleri kullanıcıyı bekletmeden arka planda yapmaya yarar.Mesala uzun sürecek bir post işlemi yada veritabanı işlemini arka planda kullanıcaya belli etmeden servislerde yapabiliriz.İkincisi ise uygulama arka plana alındığında bile çalışmaya devam etmesi.Örneğin mp3 player,radyo yada sunucuyla iletişim.
Screenshot_2014-06-29-17-15-10
Benim yazdığım uygulamaya gelcek olursak service Anasayfa activity den açılıp kapanıyor. Service açıkken uygulama açık olsada olmasada her 60 sn de bir sunucuyla iletişime geçip gelen veriyi Notification yardımı ile bize bildiriyor aynı anda service den telefon titretiliyor ve bildirim sesi çalınıyor.Gerekli olan açıklamaları kod üzerinde yapmaya çalıştım.

Arkadaşlar bu dersimde basitce bir notification oluşturdum.Bu oluşturduğum notification Android api 11 üzeri cihazlarda çalışır. Aslında gerçek bir uygulama yazılacak olursa api 11 altı, api 11 ile 16 arası ve api 16 üstü cihazlarda çalışacak şekilde ayrı ayrı yazılması gerekiyor.Ancak burda dersimiz Android Service Kullanımı olduğ için notification kısmı ile çok uğraşmadım. İlerleyen zamanlarda Android Notification ile ilgili başka bir ders yayınlayabilirim.

Şimdi gelelim kodumuza
[wpdm_file id=10]

Anasayfa Activity

import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class Anasayfa extends Activity {
	Button servisButon;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_anasayfa);
		
		servisButon = (Button)findViewById(R.id.button1);//Butonu tanımlıyoruz.
		
		if(servisCalisiyormu()){//Servis Çalışıyor mu kontrol
			servisButon.setText("Servisi Durdur");
		}else{
			servisButon.setText("Servisi Başlat");
		}
		
		servisButon.setOnClickListener(new View.OnClickListener() {//Buton a clicklistener ekliyoruz
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Log.d("Servis Çalışıyor mu",""+servisCalisiyormu());
				if(servisCalisiyormu()){//Servis çalışıyorsa
					Intent intent = new Intent(getApplicationContext(),NotificationService.class);
					stopService(intent);//servisi durdurur
					servisButon.setText("Servisi Başlat");
				
				}else{//Servis çalışmıyorsa
					
					Intent intent = new Intent(getApplicationContext(),NotificationService.class);
					startService(intent);//Servisi başlatır
					servisButon.setText("Servisi Durdur");
				}
			}
		});
		
	}
	public boolean servisCalisiyormu(){//Servis Çalışıyor mu kontrol eden fonksiyon
		
		 ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
		    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
		        if ( NotificationService.class.getName().equals(service.service.getClassName())) {
		            return true;
		        }
		    }
		    return false;
	}
	
	
}

Notification Service

import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;

public class NotificationService extends Service{
	Context context ;
	Notification notification;
	Timer timer;
	String url = "http://www.mobilhanem.com/test/deneme.php";//post edeceğimiz deneme adresi
    String cevap;
    PostClass post = new PostClass(); //Post class ı çağırıyoruz.
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
    public void onCreate() {//Servis startService(); metoduyla çağrıldığında çalışır
		context = getApplicationContext();
        Toast.makeText(this, "Servis Çalıştı.Bu Mesaj Servis Class'dan", Toast.LENGTH_LONG).show();
        
        timer = new Timer();
        timer.schedule(new TimerTask() {  //her 60 sn de bir bildirimGonder(); metodu çağırılır.       
            @Override
            public void run() {
                bildirimGonder();
            }

        }, 0, 60000);
      
    }
	public void bildirimGonder(){// Burda servis class dan post edip sunucudan aldığımız değeri bildirim gönderiyoruz.
			
        	List<NameValuePair> params = new ArrayList<NameValuePair>(); //Post edilecek değişkenleri ayarliyoruz.
			//Bu değişkenler bu uygulamada hiçbir işe yaramıyor.Sadece göstermek amaçlı
        	params.add(new BasicNameValuePair("isim", "taha"));
        	params.add(new BasicNameValuePair("mail", "[email protected]"));
        	cevap = post.httpPost(url,"POST",params,20000);//sunucudan gelen değeri cevap stringine atıyoruz
		    
        	int icon = R.drawable.ic_launcher;//notificationda gösterilecek icon
	        long when = System.currentTimeMillis();//notificationın ne zaman gösterileceği
	        String baslik = "mobilhanem.com";//notification başlık
	        NotificationManager nm=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
	        Intent intent=new Intent(context,Anasayfa.class);
	        PendingIntent  pending=PendingIntent.getActivity(context, 0, intent, 0);//Notificationa tıklanınca açılacak activityi belirliyoruz
	        Notification notification;
	                notification = new Notification(icon, "Yeni Bildirim", when);
	                notification.setLatestEventInfo(context,baslik,cevap,pending);
	           
	        notification.flags |= Notification.FLAG_AUTO_CANCEL;//notificationa tıklanınca notificationın otomatik silinmesi için
	        notification.defaults |= Notification.DEFAULT_SOUND;//notification geldiğinde bildirim sesi çalması için
	        notification.defaults |= Notification.DEFAULT_VIBRATE;//notification geldiğinde bildirim titremesi için
	        nm.notify(0, notification);
	}
	 @Override
    public void onDestroy() {//Servis stopService(); metoduyla durdurulduğunda çalışır
		timer.cancel();
        Toast.makeText(this, "Servis Durduruldu.Bu Mesaj Servis Class'dan", Toast.LENGTH_LONG).show();
    }
	
}

Post Class ı yada HttpPostu nasıl yaptığımı burda anlatmıyorum. Bu konu hakkında detaylı bilgi ve örnek uygulamaları incelemk için buradaki ve buradaki derslerime bakabilirsiniz.
Bu dersimde anlatmak istediklerim bu kadar. Anlamadığınız yerleri sorabilirsiniz.Elimden geldiğince cevap vermeye çalışacağım.Birdahaki dersimizde Android Genymotion Emulatörü kurmayı ve kullanmayı anlatacağım.Yeni dersimizde görüşmek dileğiyle…

Tüm Android Ders, Proje ve Kaynak Kodlar için tıklayınız.
[wpdm_file id=10] 7

Taha Kırca

iOS & Android & Apple Watch Developer, Mobilhanem.com yazarı, Karadeniz Uşağu, Ordu Sevdalısı

46 Yorum

  • İyi günler belki çok komik ve basit bir soru olacak ama bu notification service sayfasını nasıl açacağım? bulamadım :S

    • Notification Service bir activity değildir. O yüzden bir arayüze sahip değildir. Çalıştığını kullanıcı anlamaz . Sadece arka planda çalışır ve Android İşletim Sistemi yada kullanıcı durdurmadığı sürece çalışmaya devam eder.
      O yüzden sizin dediğiniz gibi açılacak bir sayfa değildir. Sadece başlatılıp durdurulabilir.

      Bu kod servisi başlatır ve arkaplanda çalışır.
      Intent intent = new Intent(getApplicationContext(),NotificationService.class);
      startService(intent);//Servisi başlatır

      Bu kod servisi durdurur.
      Intent intent = new Intent(getApplicationContext(),NotificationService.class);
      stopService(intent);//servisi durdurur

      Ayrıca sorularınızı çekinmeden sorabilirsiniz .

      • peki bu servisi hangi sayfada başlatmam gerekiyor tam olarak ? yani oluşturduğum proje bir ilaç hatırlatıcı ve ilaç _adı denilen sayfa ile çalışmaya başlıyor. Bu başlangıç sayfası içinde mi servisi başlatmam gerekiyor cevapta verdiğiniz kodlar ile?

        • Evet orada başlatabilirsiniz. NotificationService i notification göndermek için mi kullanacaksınız. Eğer öyleyse service class dan değil activity den de yapabilirsiniz.

          • Ben kurulan alarmın vakti geldiğinde çalabilmesi için arka planda çalışmaya devam etmesini sağlamak istiyorum ama tam olarak hangisini uygulamak daha uygun olur?

          • Bunun için Android de AlarmManager diye bir yapı var onu incelemeni tavsiye ederim.Çok daha kesin çözüm elde edebilirsin.

          • service kullanmama gerek kalmıyor değil mi o zaman işletim sisteminin saatini alıyor?

  • Simdi bu serviceler kapanabiliyor mesala android cihazda task manager gorev yoneticisinden tüm uygulamaları temizle diyince service kapanıyor.
    Buda uygulamanın calısmamasını saglıyor ?

    Kapanmaması icin ne yapabılırıım ?
    Amacım
    saat 19:12 olunca hergün bir bildirim gelmesi

    • Serviceler Task Kiler lar tarafından kapatılsada bir süre sonra Android onları geri açıyor. Mesala bu uygulamamı kur Task killer çalıstr 3 5 dakika Notification atmıcaktır.Ama bir süre sonra Android İşletim Sistemi tarafından açılıp Notification atmaya devam edecektir. Senin amacın saat 19:12 de Notification atması ise bunun için Android in AlarmManager classını incelemeni tavsiye ederim.
      Kolay Gelsin..

  • Merbaha bu boyle bir service olusdurdum ancaq bir sorun yasadim sizin olusdurdugun servicenide test etdim ancaq bundada ayni sonucu aldim
    Service calisiyor ancaq MainActivity kapatildigi an service kapanmiyor ancaq Notification dayaniyor onCreate ile olusdurdugum icin startService bagli duruma dusuyor bunu nasil yapa bilirimki MainActivity kapansa bile Notification dayanmasin

    • Service Class ları amacı zaten Uygulama kapansa bile arka planda çalışmasıdır. Sen uygulama kapandığı zaman Notification gelmesini istemiyorsan Notification gönderme olayını Service Class da değil Activity içinde yapacaksın.

      • Hayir sorunda burasinda mainactivity kapandigi an sitemdeki mekaleleri cekmiyor isleme durumunde com.test.My_Service calisiyor 0 bayt boyle yaziyor
        Sorun notification diyil notificationu service kuruyorum http.post bunu kullanmadan guzel calisiyor fakat http.post kullandigimda mainactivity acik oldukda sorunsuz calisiyor ancaq mainactivity kapansa yani proqram kapatildikda service calisiyor fakat sitemdeki hic bir mekaleni cagirmiyor ve notificationda calismaz duruma dusuyor

      • Yardimin icin tesekkurler sorunu cozdum sorun gozumun ondeymis kucuk bir hata onuda halletdim 🙂 tesekkurler

  • Sayın Taha Kırca,
    Servis kullanırken mysql veritabanımda mesaljar tablosuna kayıt olup olmadığına bakıp yeni kayıt var ise notification göndermek istiyorum. Nasıl bir mantık yürütmeliyim bilemedim doğrusu. Mesela sunucuda yeni bir php dosyası oluşturup kayıt kontrolünü onunla yaptırıp servise çağırmalımıyım yada önceki mesajı kaydeden .php dosyasında bir değişiklik mi yapmalıyım. Yada mesajı gönderen kullanıcıların gönderimi sırasında parse işlemi sırasında böyle bir notification servisi gönderebilirim ama bu seferde herkese değil yetkili kullanıcılara göndermeliyim, yardımlarınız için Teşekkürler

    • Sorunu tam olarak anlayamadım. eğer biraz daha detaylı anlatabilirsen yardımcı olmaya çalışacağım. Ama şunu söyliyeyim servis ile sürekli örneğin her 5 sn de bir sunucudan mesaj var mı diye kontrol ettirmek doğru değil. Bunun yerine php ile mesaj geldiğinde direk notification göndermen gerekir.

      • Sayın Kırca, aslında şuraya kadar yaptım. Sizin örneğinizle sunucuyu kontrol ettigimde json verisi bu {“message”:”1″}. android kısımda ise buradaki message =1 ise notification göndersin 0(sıfır) ise göndermesin istiyorum o kadar. Sizin dediğiniz şekilde sunucu taraflı olabilir ancak bu seferde tüm kullanıcılara göndermiş olurum. Orada kullanıcıları seçmem gerekecek ki gcm servisini kullanmam gerekecek dahada zor olacak (benim için) . Benim izlediğim yolda kullanıcının zaten login olduğu activity de notificationu çağırıyorum. Yardımlarınız için teşekkürler

        • Anladım ama sürekli sunucuya istek gönderip kontrol ettirmek hem ram hem data kullanımı artıracak dolayısıyla pil kullanımını artıracak. Yaptığınız bir çözüm ama doğru olanı Push Notification göndermek. Push notification için de php de kontrolleri yapıp gerekli kişilere push gönderebilirsin. Çözümü paylaştığın için teşekkür ederiz .
          Kolay gelsin..

  • hocam öncelikle paylaşımların için teşekkürler,
    Dersinizden kopya çekerek birşeyler yaptım ancak takıldığım bir yer var;
    Servisi çalıştırma işlemini yaptım ancak servis içinde activity işlemleri yapamayacağım için servis arka planda MainActivity sayfasını çalıştırsın istiyorum ancak MainActivity çağırma işlemini yaptıramadım.

  • İyi Günler Bir Siteden Veriler Çekip Notification Mesajı veriyorum .Lakin Uygulamayı Telefonun ortadaki tuşu ile değilde tümüyle kapatınca notification işi duruyor.Bu Örneğinizde de duruyor .Uygulama Tamamen kapatıldığında da bildirim almayı nasıl yapabilirim

  • İyi Günler Bir Siteden Veriler Çekip Notification Mesajı veriyorum .Lakin Uygulamayı Telefonun ortadaki tuşu ile değilde tümüyle kapatınca notification işi duruyor.Bu Örneğinizde de duruyor .Uygulama Tamamen kapatıldığında da bildirim almayı nasıl yapabilirim. Uygulama resimde şu an açık bn sağdaki tuşa basıp parmağımı sağa oynatınca uygulama kapanıyor.İşte bu kapandığı halde notification göndermeyi nasıl yapabilirim

    Teşekkürler,İyi çalışmalar

    • Notification ‘ı nasıl gönderiyorsun. Yani sunucu ile bağlantı yapıyor musun yoksa her gün 1 tane mi bastırıyorsun ? Nasıl bir notification kullanıyorsun ?

      • şu an o kendi örneğimden vazgeçtim sadece sizin uygulamanıza bunu nasıl yapabilirm onu söylerseniz yeterli Taha bey

      • şu an o kendi örneğimden vazgeçtim sadece sizin uygulamanıza bunu nasıl yapabilirm onu söylerseniz yeterli Taha bey

    • Hocam bende bu konu üzerinde uygulama yapmaya çalışıyorum. Uygulamamız tamamen kapanınca servisin sürekli çalışmasını nasıl sağlayabilirim yardımcı olursanız sevinirim

  • […] Yukarıdaki gibi ayarlarımızı yaptıktan sonra Projemize iki adet Class ekleyeceğiz. Bu classlardan birincisi FirebaseInstanceIdService class’ına extend edecek diğeri ise FirebaseMessagingService class’ına extend edecek. FirebaseInstanceIdService class’ı ve FirebaseMessagingService’i class’ı build.gradle’ın dependencies kısmına eklediğimiz Firebase-messaging kütüphanesi ile projemize dahil oldu. Bu iki class’ta Service Class’lardır. Yani uygulamanın arka planında çalışmaktadırlar. Android Service Class’lar hakkında detaylı bilgiyi bu yazımızdan bulabilirsiniz. […]

  • Hocam Birde uzun kullanımda ikidebir ” …… durduruldu ” hatası çıkıyo yani uygulamamın servicesi durduruluyor.. istediği zaman durdursun sıkıntı değil nasıl olsa geri kendi kendine başlatılıyo ama bari o yazıyı yazmasın.. mümkünmüdür hocam

    • Bu Sorunuda çözdüm.. Başka arkadaşlarında başına gelirse diye söyleyim.. Timer ın içinde sql lite bağlantısı yapmayın :)) bi zaman sonra hata vermeye başlıyor.

  • Merhaba Hocam,
    Gayet açıklayıcı olmuş teşekkürler.Fakat takıldığım bir yer var. Yukarıdaki servis i başlattıktan sonra uygulamayı destroy edince servis tekrar çalışıyor ve bildirim geliyor.Ayrıca uygulamayı açınca da geliyor.Acaba notification ı run metodu dışında başka metodlarda mı kullanmak gerekiyor ? veya bunu sorunu nasıl çözebilirim.
    Uygulama üzerinden örnek vermek gerekirse servisin 30 günde bir değişkenimi 1 atttırmasını ve kullanıcıya bildirim göndermesini istiyorum.Herşey tamam fakat uygulamadan çıkınca da bildirim geliyor ve sayaç artıyor.Bu sorunu nasıl çözebilirim acaba ?
    Kolay gelsin

  • Merhaba. Veritabanında kayıtlı olan saate göre kullanıcıya görev hatırlatması yapmak istiyorum. Kayıtlı saati sürekli kontrol etmek dışında telefonu yormadan bunu hangi yöntem ile yapabilirim ?

    • Kayıtlı saati sürekli kontrol etmek zaten yanlış bir yöntem. Doğru olan o kayıtlı saate bir Alarm set etmen. Yani işlemini AlarmManager ile yapman daha doğru.

      • Merhaba Taha bey. Ben de benzer konuda sıkıntı yaşıyorum. veritabanındaki kayıtlı saatlerde bildirim gelecek nasıl bir yol izlemeliyim yardımcı olabilir misiniz?

  • Merhaba .Android konusunda yeniyim..
    Bir örnekten Yüzen Pencere yaptım. MainAktivityden bir Servis başlatılıyor buda Yüzen Pencerenin arayüzünü Çalıştırıyor.
    Şimdi Arka Planda HTTPRequest benzeri bir işlem yapmak istiyorum .
    Elde Ettiğim Sonuçlarıda Tekrar Yüzen pencere işlemine göndericem.
    AsyncTask ile yapılan Örnekler var. Ancak Benim Sorgu işlemi uzun sürdüğünden AsyncTask ile tüm sorguyu alamıyorum. Oyüzden bunuda bir servis uygulamsı ile yaptım ama oluşturdugum verileri tekrar yüzen Pencere Servisine nasıl göndericem. bunu bir türlü yapamadım..
    Servisten Servise Veri aktarmam gerekiyor.

  • notification. setLatestEventInfo(context,baslik,cevap,pending);
    kısmında hata alıyorum “setLatestEventInfo” altı çizili

    error kısmında bu yazıyor :

    Unknown method ‘setLatestEventInfo’ of ‘android.app.Notification’

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?