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.
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
İ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..
Cok acıklayıcı Tesekkürler.
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
Önemli değil. Kolay Gelsin:)
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.
Ellerinize saglik
Teşekkürler
İ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. […]
setLatestEventinfo metodunda hata çıkıyor hocam Program bu metodu tanımıyor
Hocam Notification.Builder ile geçer.. Ya da bu method 5.1.1 işletim sistemleri altında kullanılıyor
Aynen Hocam Geç oldu ama oldu :))
Teşekkürler :))
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
AlarmManager kullanacaksın. Uygulama her açıldığında 30 gün sonrası için AlarmManager kullanarak bildirim göndereceksin.
manifest dosyasina
eklemeyi unutmayin yoksa calismaz.
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.
Teşekkürler. Verdiğiniz bilgi çok işime yaradı.
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?
Bu sistemi kurdugumuzda uygulama tamamen kapatılsa dahil bildirimleri telefon alabiliyor olucak mı ?
Sormak istediğiniz şey push notification ise bu ders push notification dersi değil.
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’