Bu dersimizde bound service’i öğrenmemizi sağlayacak örneğimize devam ediyoruz.
Bir önceki derste bound service sınıfımızın kodlarını yazmıştır ve servisimiz her saniyede random bir sayı üretecek şekilde çalışıyordu. Şimdi sıra main activity’de bazı kodlar yazarak servisle activity’i birbirine bağlamaya ve servis üzerindeki verilere erişmeye geldi.
bindService : Bu method sayesinde componenti servisimize bağlarız. 3 tane parametre alır.
1.parametre servisimizi çağırdığımız explict intent nesnesi
2.parametre servis ile component arasındaki bağımlılığı kontrol eden ServiceConnection interfacesi
3.parametre ise int bir sabit olan ve servisle componentin bağlantısının türünü belirten flag değeri. Örneğimizde BIND_AUTO_CREATE bayrağını kullandık. Bu bayrak servise bağlı olan bir component olduğu sürece servisi otomatik olarak yaratacağını bildiriyor.
unbindService: Bu method sayesinde component ile servisimiz arasındaki bağlantıyı koparırırz. Sadece ServiceConnection nesnesi alır (bindService methoduna gönderdiğimiz 2. parametre ile aynı)
ServiceConnection’dan field eleman oluşturduğumuzda iki tane methodu override etmemiz gerekiyor.
1. method olan onServiceConnected sayesinde servis sınıfı nesnesini activity’e getiririz. Ve bu method bind yani bağlama işlemi gerçekleştiğinde tetiklenir.
2. method olan onServiceDisconnected ie sadece service olan bağlantı kaybedildiğinde çağrılır.Bu servis crash olduğunda veya sistem tarafından kill edildiğinde olur. Bizim servisi durdurmamız veya servis ile component arasındaki bağlantıyı koparmamız bu methodu tetiklemez. Bu method içinde sadece servise bağlantıyı kontrol ettiğimiz değişkenin değerini değiştiririz.
Servisle component arasındaki bağlantıyı kontrol eden değişkene göre işlemleri yapmalı/yapmamalıyız. Ve bu değişkenin değerini bind ve unbind işlemlerinden sonra güncellemeyi unutmayalım.
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 |
public class MainActivity extends AppCompatActivity { private final static String TAG = MainActivity.class.getSimpleName(); private ServiceConnection connection; private boolean serviseBagliMi = false; private MyBoundService myBoundService; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void startMyBoundService(View view) { Intent intent = new Intent(this, MyBoundService.class); startService(intent); Log.e(TAG, "SERVICE BASLATILDI"); } public void stopMyBoundService(View view) { Intent intent = new Intent(this, MyBoundService.class); stopService(intent); Log.e(TAG, "SERVICE DURDURULDU"); } public void bindMyBoundService(View view) { if (connection == null) { connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { MyBoundService.MyLocalBinder myLocalBinder = (MyBoundService.MyLocalBinder) service; myBoundService = myLocalBinder.getService(); serviseBagliMi = true; Log.e(TAG, "SERVICE CONNECTED CAGRILDI"); } @Override public void onServiceDisconnected(ComponentName name) { serviseBagliMi = false; Log.e(TAG, "SERVICE DISCONNECTED CAGRILDI"); } }; } if (serviseBagliMi == false) { Intent intent = new Intent(this, MyBoundService.class); bindService(intent, connection, BIND_AUTO_CREATE); Log.e(TAG, "SERVIS BAGLANTISI YAPILDI"); serviseBagliMi = true; } else { Toast.makeText(this, "Servise zaten bağlı", Toast.LENGTH_SHORT).show(); } } public void unbindMyBoundService(View view) { if (serviseBagliMi == true) { unbindService(connection); serviseBagliMi = false; Log.e(TAG, "SERVIS BAGLANTISI KESILDI"); } else { Toast.makeText(this, "Servise zaten bağlı değil", Toast.LENGTH_SHORT).show(); } } public void getRandomNumber(View view) { if (serviseBagliMi == true) { Toast.makeText(this, "Üretilen Sayi :" + myBoundService.getSayi(), Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "Önce servis bağlantısını yapın", 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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
public class MyBoundService extends Service { private final static String TAG=MyBoundService.class.getSimpleName(); private int sayi; private boolean sayiUreticisiAcikMi; class MyLocalBinder extends Binder{ public MyBoundService getService(){ return MyBoundService.this; } } private IBinder myLocalBinder=new MyLocalBinder(); @Nullable @Override public IBinder onBind(Intent intent) { Log.i(TAG, "ONBIND"); return myLocalBinder; } @Override public void onCreate() { Log.i(TAG, "ONCREATE"); super.onCreate(); } @Override public void onDestroy() { Log.i(TAG, "ONDESTROY"); sayiUreticisiAcikMi=false; super.onDestroy(); } @Override public int onStartCommand(Intent intent,int flags, int startId) { Log.i(TAG, "ONSTARTCOMMAND"); sayiUreticisiAcikMi=true; new Thread(new Runnable() { @Override public void run() { sayiUret(); } }).start(); return START_STICKY; } private void sayiUret(){ while(sayiUreticisiAcikMi) { try { Thread.sleep(1000); sayi = new Random().nextInt(100); Log.i(TAG, "Sayi : " + sayi + " Thread Adı: " + Thread.currentThread().getName()); } catch (InterruptedException e) { e.printStackTrace(); } } } } |
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 |
<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="startMyBoundService" 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="stopMyBoundService" android:text="STOP SERVICE" /> <Button android:id="@+id/button5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignStart="@+id/button4" android:layout_below="@+id/button4" android:layout_marginTop="15dp" android:onClick="bindMyBoundService" android:text="BIND SERVICE" /> <Button android:id="@+id/button6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignStart="@+id/button5" android:layout_below="@+id/button5" android:layout_marginTop="15dp" android:onClick="unbindMyBoundService" android:text="UNBIND SERVICE" /> <Button android:id="@+id/button7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/button6" android:layout_centerHorizontal="true" android:layout_marginTop="20dp" android:onClick="getRandomNumber" android:text="Rastgele Sayıyı Al" /> </RelativeLayout> |