Bu derste activity’den receiverlarımıza veri gönderme yollarını ve broadcastreceiverlarla ilgili gerçek hayat örneklerini anlatmaya çalıştım.
Öncelikle şunu söylemek gerekir ki broadcast receiverlar asenkron olarak çalıştırılır. Ama thread olarak main thread’i yani UI Threadi kullanır. Bu thread uygulamamız için ana thread’dir ve kullanıcının uygulamayla olan etkileşimlerini ele alır. Bu threadi 10 saniyeden uzun süren işlemler için kullanırsak uygulama crash olur veya kullanıcı uygulamanın çalışmadığını düşünebilir. Bunun için 10 saniyeden fazla süren işlemleri activity veya broadcastreceiverlara yaptırmamak, bunun için servicesleri kullanmak gerekir.
Activity’lerden broadcast receiverlara veri göndermek için ya ilgili intent nesnesi direk olarak kullanılır ya da yeni bir bundle nesnesi oluşturularak ilgili intente bu bundle atanabilir. Activity’den fragmentlere veya activity’lerden activity’lere veri göndermekle aynı şeydir aslında.
Videonun sonlarına doğru broadcast receiverların gerçek hayatta nasıl kullanıldığını gösteren bir örnek yaptık. Bu örnekte telefon uçak moduna geçtiğinde MyFirstReceiver sınıfı tetiklendi. Çünkü bu receiverın manifest dosyasındaki action name kısmına android.intent.action.AIRPLANE_MODE yazdık. Peki bu ne demek?
Ne zaman ki cihaz uçak moduna geçer veya bu moddan çıkarsa Android işletim sistemi tüm uygulamalara bu değişikliği broadcast yapar yani yayar. Daha sonra bu olayı ele alacak receiver tetiklenir. Ki bizim örneğimizde bu receiver MyFirstReceiver sınıfı oldu. İşletim sisteminde olacak olayları receiverların action name kısmına belirtirseniz bu olayları ele alacak uygulamalar yapabilirsiniz.
Ayrıca uygulamanız ekranda olmasa hatta açılmamış olsa bile bu değişikliğe tepki verir.
Bu dersin sonunda örneğimizin 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 |
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 sendBroadcastMessage(View v){ //Intent intent=new Intent(this, MyFirstReceiver.class); Intent intent=new Intent("my.custom.action.name"); intent.putExtra("ad", "Emre Altunbilek"); intent.putExtra("yas", 28); sendBroadcast(intent); } public void sendBroadcastMessajetoInnerClass(View view) { //Intent intent=new Intent(this, MySecondReceiver.class); Intent intent = new Intent("my.custom.anotheraction.name"); Bundle bundle=new Bundle(); bundle.putString("ad", "Emre Altunbilek"); bundle.putInt("yas", 28); intent.putExtras(bundle); sendBroadcast(intent); } public static class MyInnerReceiver extends BroadcastReceiver{ private static final String TAG=MyInnerReceiver.class.getSimpleName(); @Override public void onReceive(Context context, Intent intent) { Log.i(TAG, "Inner receiver'dan selamlar"); String isim=intent.getStringExtra("ad"); int yas = intent.getIntExtra("yas", 0); Log.i(TAG, "Isım degeri :" + isim + " Yas : "+ yas); Toast.makeText(context, "Inner receiver'dan selamlar", Toast.LENGTH_LONG).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 |
<?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.broadcastreceiverornek1.MainActivity"> <Button android:id="@+id/btnBroadcastNow" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:onClick="sendBroadcastMessage" android:text="Broadcast Now!" /> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/btnBroadcastNow" android:layout_centerHorizontal="true" android:onClick="sendBroadcastMessajetoInnerClass" android:layout_marginBottom="100dp" android:text="Broadcast to InnerClass" /> </RelativeLayout> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class MyFirstReceiver extends BroadcastReceiver { private static final String TAG=MyFirstReceiver.class.getSimpleName(); @Override public void onReceive(Context context, Intent intent) { String isim=intent.getStringExtra("ad"); int yas = intent.getIntExtra("yas", 0); Log.i(TAG, "Isım degeri :" + isim + " Yas : "+ yas); Log.i(TAG, "Birinci receiver'dan selamlar Thread adı :" + Thread.currentThread().getName()); Toast.makeText(context, "Birinci receiver'dan selamlar", Toast.LENGTH_LONG).show(); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class MySecondReceiver extends BroadcastReceiver { private static final String TAG=MySecondReceiver.class.getSimpleName(); @Override public void onReceive(Context context, Intent intent) { Log.i(TAG, "İkinci receiver'dan selamlar"); Toast.makeText(context, "İkinci receiver'dan selamlar", Toast.LENGTH_LONG).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 |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.emrealtunbilek.broadcastreceiverornek1"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".MyFirstReceiver"> <intent-filter> <!-- <action android:name="my.custom.action.name"></action> --> <action android:name="android.intent.action.AIRPLANE_MODE"></action> </intent-filter> </receiver> <receiver android:name=".MySecondReceiver"> <intent-filter> <action android:name="my.custom.action.name"></action> </intent-filter> </receiver> <receiver android:name=".MainActivity$MyInnerReceiver"> <intent-filter> <action android:name="my.custom.anotheraction.name"></action> </intent-filter> </receiver> </application> </manifest> |
Hocam lutfen cevap verirmisen su kodlar android 9 da calismiyor manifest usulu action name yontemi calismiyor lutfen yardim et