Bu derste sticky broadcast receiver’ın ne olduğundan ve nasıl kullanıldığından bahsetmeye çalıştık.
Normal bir broadcast receiver’da bir olay(event/action) gerçekleştiğinde o eventi ele alacak bir uygulama veya sınıf varsa tetiklenir. O uygulama açık değilse tetiklenme olayı olmaz ve ilgili intent yayın yapıldıktan sonra kaybolur/ölür. Ama sticky broadcast receiverlar da durum böyle değildir.
Mesela batarya durumunun değişikliğini ele alan bir uygulamamız olsun. Eğer batarya şarj ediliyor veya şarjdan çıkarıldığında işletim sistemi tarafından bir broadcast mesaj yayınlanır ve uygulamamız açıksa bu olay ele alınırdı. Uygulamamız açık değilse ise bu mesaj alınamaz ve bu mesajdan sonra bile uygulamayı çalıştırsak ilgili receiver methodu çalıştırılmazdı. Ama sticky broadcast receiverlarda daha önceden gerçekleşen olaylar bile alınabilir.
Sticky broadcast mesajlarını göndermek için sendStickyBroadcast methodu kullanılırdı. Ama api 21 yaniLollipop sürümünden sonra düşük güvenlik ve düşük protection level sebepleriyle deprecated olmuştur, yani api 21 ve sonrasında kullanılamaz. Yani kendi oluşturacağımız broadcastreceiverları stick olarak kullanamıyoruz.
Ancak günümüzde hala android işletim sistemi tarafından bazı actionlar sticky olarak kullanılmaktadır. Örneğin batarya durumu, cihazın depolama durumu vs… Bunları kullanırken sendStickyBroadcast yerine dinamik olarak registerReceiver kullanmalıyız.
Dinamik olarak receiver tanımı yaparken genellikle onResume methodu içinde registerReceiver() methodunu kullanırız. Bu method birinci parametre olarak ilgili broadcastreceiver nesnesini, ikinci parametre olarak da bir intent filter nesnesini bekler.
Bir receiverı dinamik olarak tanımladıktan sonra genellikle onPause methodunda unRegisterReceiver() methodu ile sonlandırmalıyız. Aksi taktirde Leaked Intent Receiver hatası alırız. Bu yüzden register ettiğimiz bir receiverı unregister etmeyi unutmamamız gerekiyor.
Dinamik receiverlar activity çalıştığı sürece tanımlıdır. İlgili activity’den veya uygulamadan çıkıldığında çalışmayı durdurur.
Bu ders sonunda 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 |
public class MainActivity extends AppCompatActivity { private static final String TAG = MainActivity.class.getSimpleName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void methodBir(View view) { IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED); Intent intent = registerReceiver(null, intentFilter); int bataryaDurumu = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); bataryaDurumunuGoster(bataryaDurumu); } public void methodIki(View view) { IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED); registerReceiver(bataryaReceiver, intentFilter); } private BroadcastReceiver bataryaReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { int bataryaDurumu = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); bataryaDurumunuGoster(bataryaDurumu); } }; public void bataryaDurumunuGoster(int bataryaDurumu) { switch (bataryaDurumu) { case 1: Toast.makeText(getBaseContext(), "Batarya durumu bilinmiyor", Toast.LENGTH_LONG).show(); break; case 2: Toast.makeText(getBaseContext(), "Şarj oluyor", Toast.LENGTH_LONG).show(); break; case 3: Toast.makeText(getBaseContext(), "Şarj olmuyor", Toast.LENGTH_LONG).show(); break; case 4: Toast.makeText(getBaseContext(), "Şarjdan çıkarıldı", Toast.LENGTH_LONG).show(); break; case 5: Toast.makeText(getBaseContext(), "Batarya dolu", Toast.LENGTH_LONG).show(); break; } } @Override protected void onPause() { super.onPause(); unregisterReceiver(bataryaReceiver); } } |
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 |
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.emrealtunbilek.stickybroadcastornek.MainActivity"> <Button android:id="@+id/btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:layout_marginTop="207dp" android:onClick="methodBir" android:text="Method 1" /> <Button android:id="@+id/btn2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/btn1" android:layout_alignParentEnd="true" android:onClick="methodIki" android:text="Method 2" /> </RelativeLayout> |