Bu dersimizde remote binding yani iki farklı process üzerindeki veri alış verişinin 2. kısmını anlatıyoruz.
İlk kısımda servisimizi oluşturmuş ve farklı processteki activity’den gelecek mesaja cevap verebiliyordu.
Bu derste de activitynin sayı isteme isteğini ve gelen cevabı ele almasını sağlayacak mekanizmayı hazırlıyoruz.
Uygulamamızın çalışma mantığını özetlersek:
1-Activity sayi isteğini IBınder ile Messengera bildirir.
2-Messenger bu isteği servis tarafındaki messengera iletir.
3-Servis kısmındaki messenger bir handle’ı referans gösterir ve ona bağlıdır. Ona gelen istek bu handler içinde alınır ve yine karşı tarafın messengerı tarafından alınacak şekilde geriye dönüş yapılır.
4-Servis tarafından gönderilen sayı activity içindeki messengara iletilince, bu messengerın referans gösterdiği handler içinden bu veri okunur ve kullanıcıya gösterilir.
Daha öncede dediğimiz gibi Bound Servisi bir server, ondan veri isteyen componenti client olarak düşünebiliriz. Bu dersimizde client kısmını yapıp örneğimizi tamamlayacağız.
——
Resime dikkat ederseniz activity ile servis birbirlerine messenger ile bağlılar. Bu sayede hem ikisi arasındaki köprü kurulu, hem de biz activity’den servise sayı istediğimizi belirtiriz. Bu bağ ServiceConnection sınıfının onServiceConnected methodunda kurulur.
Bu methoda parametre olarak gelen Ibinder tipindeki service nesnesini, activity içinde oluşturduğumuz sayiIstegiGonderMessengera atarsak, bağlantıyı kurmuş oluruz. Yine bu method içinde servisten yollanılan sayı değerinin iletileceği gonderilenSayiyiAlanMessenger tanımlıyoruz. Buna gelen mesaj GelenSayiyiAlanHandler sınıfında ele alınıyor ve kullanıcıya sunuluyor.
Kullanıcı sayı al butonuna tıkladığında sayiIstegiGonderMessenger nesnesi ile servisimize bir mesaj gönderiyoruz. Bu mesaja ayrıca servis bu mesaja cevap verdiğinde, gelecek olan mesajın iletileceği nesneyi de belirtiyoruz. Bu nesne bizim örneğimizde gonderilenSayiyiAlanMessenger isimli messenger…
Servisimize bu mesaj gelir, mesaja istenilen sayı konulur ve msg.replyTo.send(mesaj); denilerek activity’e istenilen sayı gönderilir. Bu sayı activity’de replyTo diye belirttiğimiz gonderilenSayiyiAlanMessenger’a ulaşır. Bu messenger da GelenSayiyiAlanHandler’ı referans gösterdiği için bu mesaj bu handlerda ele alınır ve kullanıcıya gösterilir.
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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
public class MainActivity extends AppCompatActivity { private final static String TAG = MainActivity.class.getSimpleName(); boolean serviseBagliMi; int gelenSayi = 0; TextView tvGelenSayi; Messenger sayiIstegiGonderMessenger, gonderilenSayiyiAlanMessenger; class GelenSayiyiAlanHandler extends Handler { @Override public void handleMessage(Message msg) { gelenSayi = msg.arg1; tvGelenSayi.setText("Sayi :" + gelenSayi); super.handleMessage(msg); } } ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { sayiIstegiGonderMessenger = new Messenger(service); gonderilenSayiyiAlanMessenger = new Messenger(new GelenSayiyiAlanHandler()); serviseBagliMi = true; Log.e(TAG, "Service Connected Çağrıldı"); } @Override public void onServiceDisconnected(ComponentName name) { serviseBagliMi = false; sayiIstegiGonderMessenger = null; gonderilenSayiyiAlanMessenger = null; Log.e(TAG, "Service DisConnected Çağrıldı"); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvGelenSayi = (TextView) findViewById(R.id.tvSayi); } public void bindRemoteService(View view) { Intent intent = new Intent(); intent.setComponent(new ComponentName("com.example.emrealtunbilek.serversideapp", "com.example.emrealtunbilek.serversideapp.MyService")); if (serviseBagliMi == false) { if (bindService(intent, connection, BIND_AUTO_CREATE)) { serviseBagliMi = true; Log.e(TAG, "Servise bağlanıldı"); Toast.makeText(this, "Servise bağlanıldı", Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(this, "Servise zaten bağlı", Toast.LENGTH_SHORT).show(); } } public void unbindRemoteService(View view) { if (serviseBagliMi == true) { unbindService(connection); serviseBagliMi = false; } else { Toast.makeText(this, "Servise zaten bağlı değil", Toast.LENGTH_SHORT).show(); } } public void sayiIstemeButonu(View view) { if (serviseBagliMi == true) { Message mesaj = Message.obtain(null, 16); mesaj.replyTo = gonderilenSayiyiAlanMessenger; try { sayiIstegiGonderMessenger.send(mesaj); } catch (RemoteException e) { e.printStackTrace(); } } } @Override protected void onDestroy() { super.onDestroy(); } } |
1 2 3 4 5 6 7 8 9 10 11 12 |
<!--?xml version="1.0" encoding="utf-8"?--> <button> </button><button> </button><button> </button> |