Android廣播機制是Android操作系統中的一種重要組件,它通過一種發布/訂閱模式,實現了應用程序和系統之間的消息傳遞。通過廣播機制,應用程序可以向系統中或其他應用程序中發送消息,也可以接收來自系統或其他應用程序發送的消息。
一、廣播類型
Android廣播機制中,主要分為三種類型:標準廣播(Normal Broadcast)、有序廣播(Ordered Broadcast)和粘性廣播(Sticky Broadcast)。
1.標準廣播
標準廣播是一種完全非同步執行的廣播類型,發送廣播後,所有接收器幾乎同時接收到廣播,接收器之間沒有任何的優先順序,也不能攔截廣播。
//發送標準廣播 Intent intent = new Intent("com.example.broadcast.normal"); sendBroadcast(intent); //接收標準廣播 public class NormalReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "接收到一條標準廣播", Toast.LENGTH_SHORT).show(); } }
2.有序廣播
有序廣播是一種按優先順序排序的廣播類型,接收器可以通過優先順序來攔截廣播或者將廣播繼續向下傳遞,廣播最終會按照優先順序依次傳遞給各個接收器。
//發送有序廣播 Intent intent = new Intent("com.example.broadcast.order"); sendOrderedBroadcast(intent, null); //接收有序廣播 public class OrderReceiver1 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "接收到一條有序廣播(1)", Toast.LENGTH_SHORT).show(); //攔截廣播 abortBroadcast(); } } public class OrderReceiver2 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "接收到一條有序廣播(2)", Toast.LENGTH_SHORT).show(); } }
3.粘性廣播
粘性廣播是一種具有粘性的廣播類型,發送廣播後,如果沒有接收器接收到廣播,則系統會緩存廣播,等到有接收器註冊時再發送廣播。
//發送粘性廣播 Intent intent = new Intent("com.example.broadcast.sticky"); sendStickyBroadcast(intent); //接收粘性廣播 public class StickyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "接收到一條粘性廣播", Toast.LENGTH_SHORT).show(); } }
二、廣播發送
1.發送標準廣播
發送標準廣播,使用Context的sendBroadcast(Intent intent)方法。
Intent intent = new Intent("com.example.broadcast.normal"); sendBroadcast(intent);
2.發送有序廣播
發送有序廣播,使用Context的sendOrderedBroadcast(Intent intent, String receiverPermission)方法。
Intent intent = new Intent("com.example.broadcast.order"); sendOrderedBroadcast(intent, null);
3.發送粘性廣播
發送粘性廣播,使用Context的sendStickyBroadcast(Intent intent)方法。
Intent intent = new Intent("com.example.broadcast.sticky"); sendStickyBroadcast(intent);
三、廣播接收
1.動態註冊廣播接收器
動態註冊廣播接收器,需要創建一個繼承BroadcastReceiver的子類,並在onReceive()方法中處理接收到的廣播。
public class NormalReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "接收到一條標準廣播", Toast.LENGTH_SHORT).show(); } } //動態註冊廣播接收器 NormalReceiver receiver = new NormalReceiver(); IntentFilter filter = new IntentFilter("com.example.broadcast.normal"); registerReceiver(receiver, filter);
2.靜態註冊廣播接收器
靜態註冊廣播接收器,需要在AndroidManifest.xml中聲明接收器,並設置intent-filter和action。
//接收標準廣播 public class NormalReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "接收到一條標準廣播", Toast.LENGTH_SHORT).show(); } }
四、廣播攔截
有序廣播可以通過攔截廣播來實現優先順序的調整,通過BroadcastReceiver的abortBroadcast()方法可以攔截之前的廣播,使廣播不再向下傳遞,只有當廣播完全執行完畢後,下一個廣播接收器才會接收到廣播。
public class OrderReceiver1 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "接收到一條有序廣播(1)", Toast.LENGTH_SHORT).show(); //攔截廣播 abortBroadcast(); } }
五、廣播註銷
動態註冊的廣播接收器,需要在不使用時註銷,否則會導致內存泄漏。
//註銷廣播接收器 unregisterReceiver(receiver);
六、總結
通過Android廣播機制,我們可以實現應用程序和系統之間的消息傳遞,提高應用程序之間的協作效率。在實際開發中,需要根據實際需要選擇不同類型的廣播,併合理處理廣播發送和接收相關操作。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/248957.html