Bu dersimizde remote binding yani iki farklı process üzerindeki veri alış verişinin nasıl olduğunu anlatmaya çalıştık.
Daha önce yaptığımız bound service örneğinin aynısını tekrar yapacağız. Ama bu sefer servisimiz ve ona bağlanan activity farklı uygulamalarda yani farklı processler üzerinde olacak. Servisimiz çalışmaya başladığında farklı bir uygulamadaki activity bu servisten random bir sayı isteyecek ve gösterecek.
Yapacağımız uygulamanın çalışma şekli aşağıdaki gibi olacak.
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 sadece server kısmını yapacağız.
——
İki farklı process birbirlerine direk olarak bağlanamazlar. Bunun için Messenger sınıfını kullanmamız gerekiyor.Messenger sınıfından yeni bir nesne üretirken bizden ya Ibinder yada Handler tipinde bir parametre bekler. Messengera gelen istekler handle içinde ele alınır ve cevap da yine buradan gönderilir.
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 |
public class MainActivity extends AppCompatActivity { private final static String TAG = MainActivity.class.getSimpleName(); Intent intent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intent=new Intent(this, MyService.class); } public void startMyService(View view) { startService(intent); Log.e(TAG, "SERVICE BASLATILDI"); } public void stopMyService(View view) { stopService(intent); Log.e(TAG, "SERVICE DURDURULDU"); } } |
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 |
public class MyService extends Service { private final static String TAG=MyService.class.getSimpleName(); private int sayi=0; private boolean sayiUreticisiAcik; class SayiIsteginiCevaplaHandler extends Handler{ @Override public void handleMessage(Message msg) { Message mesaj=Message.obtain(null, 16); mesaj.arg1=getSayi(); try { msg.replyTo.send(mesaj); } catch (RemoteException e) { e.printStackTrace(); } super.handleMessage(msg); } } private Messenger messenger=new Messenger(new SayiIsteginiCevaplaHandler()); @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. return messenger.getBinder(); } @Override public void onCreate() { Log.i(TAG,"oncreate çağrıldı"); super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(TAG,"onstartcommand çağrıldı"); sayiUreticisiAcik=true; new Thread(new Runnable() { @Override public void run() { while(sayiUreticisiAcik){ sayiUret(); } } }).start(); return START_REDELIVER_INTENT; } @Override public void onDestroy() { sayiUreticisiAcik=false; Log.i(TAG,"ondestroy çağrıldı"); super.onDestroy(); } private void sayiUret(){ try { Thread.sleep(1000); sayi=new Random().nextInt(100); Log.i(TAG, "Üretilen sayı: "+sayi+" Thread adı: "+Thread.currentThread().getName()); } catch (InterruptedException e) { e.printStackTrace(); } } public int getSayi(){ return sayi; } } |
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 |
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="12dp" android:onClick="startMyService" android:text="START SERVICE" /> <Button android:id="@+id/button4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignStart="@+id/button3" android:layout_below="@+id/button3" android:layout_marginTop="12dp" android:onClick="stopMyService" android:text="STOP SERVICE" /> </RelativeLayout> |