Bu derste intent service kavramına devam ediyoruz ve serviceden activity’e veri gönderirken broadcast receiver kullanımını inceliyoruz.
Daha önce started service konusunu incelemiştik. Bu servis geriye herhangi bir değer göndermeyen ve de onu çağıran componentten bağımsız olarak arka planda çalışan bir servis türüydü. yani onu çağıran activity kapansa bile çalışmaya devam ediyordu.
Intent servis de aslında started servicesin özel bir türü diyebiliriz(Service sınıfından extend olur). Started servisten farkı ise yapı olarak uzun süren işlemleri ele alacak şekilde tasarlanmıştır. Yani main thread üzerinde değil de worker threadde çalışacak şekilde oluşturulmuş, uzun sürecek işlemler için gelen bir servis türüdür.
onHandleIntent() methodu içerisine yazacağımız kodlar worker thread’de çalıştırılarak main threadi meşgul etmez, bu sayede kullanıcı uygulamayla etkileşim halinde olabilir. (Started servislerde bu işlem için Asynctask sınıfını kullanmıştık) Eğer servisimiz içerisinde uzun sürecek bir işlem yapacaksak intent servis tercih edilebilir.
Ayrıca yine kendi içinde bir kuyruk yapısı olduğundan birden fazla uzun sürecek işlemi servisimizde gerçekleştirebiliriz. Bu sınıf tüm işlemleri kuyruğa alır ve sırasıyla yapar.
Kuyruktaki tüm uzun/kısa süren işlemler bittiğinde de otomatik olarak servisi durdurur. Herhangi bir stopService veya stopSelf() methodu yazmamıza gerek kalmaz.
Started service gibi intent servicede de varsayılan olarak geriye bilgi gönderilmez. Ama bazen böyle bir ihtiyaç duyulabilir. Bu durumda bazı yapıları kullanarak servisimizden activity’e veri gönderebilir, layoutumuzdaki view öğelerini güncelleyebilir veya en basitinden bir toast mesajı gösterebilirz. Bu dersteki yapacağımız örnekte bir broadcast receiver kullanarak servisimizden activity’e veri gönderdik.
Öncelikle mainactivity sınıfımızda dinamik olarka broadcast receiver nesnesini oluşturuyoruz. Dinamik olarak oluşturulan broadcast receiverları manifest dosyasında belirtmemiz gerekmez ama register ve unregister işlemlerini gerçekleştirmek bizim sorumluluğumuzdadır. Broadcast receiverı onResume methodunda register eder, onPause methodunda da unregister ederiz.
Broadcast receiver’ı register ederken bir intent filter oluşturmamız ve bu intent filter’a bir action belirtmemiz gerekir. Bu sayede broadcast receiverın OnReceive methodu hangi olayda tetiklenecekse bunu android işletim sistemine belirtmiş oluruz.
Daha sonra veri göndermek istediğimiz servis sınıfında göndermek istediğimiz verileri bir intent nesnesine koyarak sendBroadcast mesajı ile bunu activity’e geri gönderebiliriz. Oluşturacağımız bu intent nesnesine action name tanımlayarak hangi broadcast receiver’a ulaşmak istediğini belirtiriz.
Artık servisimizden activity’mize yaptığımız işlem ile ilgili veri alabilir ve bu veri sayesinde main thread içindeki viewları istediğimiz gibi güncelleyebiliriz.
Bu derste yazılan kodlar aşağıdaki gibidir :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void startIntentService(View view) { Intent intent=new Intent(MainActivity.this, MyIntentService.class); intent.putExtra("sleepTime", 5); startService(intent); } @Override protected void onResume() { super.onResume(); IntentFilter filter=new IntentFilter(); filter.addAction("my.action"); registerReceiver(myBroadcastReceiver, filter); } @Override protected void onPause() { super.onPause(); unregisterReceiver(myBroadcastReceiver); } private BroadcastReceiver myBroadcastReceiver=new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { int donguSirasi=intent.getIntExtra("veri", 1); Log.e("emre", "Döngü sırası :" + donguSirasi); Toast.makeText(MainActivity.this, "Döngü sırası :" + donguSirasi, Toast.LENGTH_SHORT).show(); } }; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
public class MyIntentService extends IntentService { private static final String TAG = MyIntentService.class.getSimpleName(); public MyIntentService() { super("MyWorkerThread"); } @Override public void onCreate() { Log.i(TAG, "oncreate methodu " + Thread.currentThread().getName() + " threadi üzerinden cagrildi"); super.onCreate(); } @Override protected void onHandleIntent(@Nullable Intent intent) { Log.i(TAG, "onHandleIntent methodu " + Thread.currentThread().getName() + " threadi üzerinden cagrildi"); int sleepTime = intent.getIntExtra("sleepTime", 1); int kontrol = 1; while (kontrol <= sleepTime) { try { Thread.sleep(1000); Intent intent1 = new Intent("my.action"); intent1.putExtra("veri", kontrol); sendBroadcast(intent1); } catch (InterruptedException e) { e.printStackTrace(); } kontrol++; } } @Override public void onDestroy() { Log.i(TAG, "onDestroy methodu " + Thread.currentThread().getName() + " threadi üzerinden cagrildi"); super.onDestroy(); } } |