在之前的博客,Android-广播概念,中介绍了(广播和广播接收者)可以组件与组件之间进行通讯,有两种类型的广播(无序广播 和 有序广播),这篇博客就来讲解无序广播的代码实现:
无序广播:接收者 同时接收到,没有顺序,所以叫无序广播
1.点击按钮发送广播出去,---> 给广播接收者,广播接收者需要订阅才能接收得到:
AndroidManifest.xml方式订阅 接收者
<!-- 订阅(Xml形式订阅接收者) 注意:订阅的是接收者,和广播发送没有半毛钱关系 --> <receiver android:name=".MyBroadcastReceiver"> <intent-filter> <!-- Action这是必写的 --> <action android:name="my.MyBroadcastReceiver.custom.action" /> <!-- 这个可有可无,一旦加了,发送者也必须要设置 --> <data android:scheme="EXO" /> <!-- 注意:这里不能加 : --> </intent-filter> </receiver>
定义 MyBroadcastReceiver 接收者
package liudeli.croadcast1; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; /** * 定义 接收者 */ public class MyBroadcastReceiver extends BroadcastReceiver { private final String TAG = MyBroadcastReceiver.class.getSimpleName(); /** * 接收的方法 * @param context 传递过来的上下文 * @param intent 传递过来的意图,可以获取很多信息 */ @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "intent.getAction():" + intent.getAction()); Log.d(TAG, "intent.getDataString():" + intent.getDataString()); } }
2.发送广播
注意:发送广播的原则:接收者怎么订阅的,我就怎么发送send:
/** * 发送无序广播 * @param view */ public void sendDisorderBroadcast(View view) { /** * 接收者是这样订阅的: * <intent-filter> * <!-- Action这是必写的 --> * <action android:name="my.MyBroadcastReceiver.custom.action" /> * * <!-- 这个可有可无,一旦加了,发送者也必须要设置 --> * <data android:scheme="EXO" /> <!-- 注意:这里不能加 : --> * * </intent-filter> */ Intent intent = new Intent(); intent.setAction("my.MyBroadcastReceiver.custom.action"); intent.setData(Uri.parse("EXO:")); // 注意:要加 : sendBroadcast(intent); }
Log日志打印:
12-17 07:15:47.317 2358-2358/liudeli.croadcast1 D/MyBroadcastReceiver: intent.getAction():my.MyBroadcastReceiver.custom.action
12-17 07:15:47.317 2358-2358/liudeli.croadcast1 D/MyBroadcastReceiver: intent.getDataString():EXO:
第二种方式订阅接收者(Java代码中订阅),比AndroidManifest.xml更加灵活
private MyBroadcastReceiver myBroadcastReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_new); /** * 【Java代码方式订阅 接收者】 * 唯一可以new的组件就是 广播 接收者 */ myBroadcastReceiver = new MyBroadcastReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("my.MyBroadcastReceiver.custom.action2"); intentFilter.addDataScheme("Beyond"); // 注意:这里不能加 : registerReceiver(myBroadcastReceiver, intentFilter); } /** * 发送无序广播 */ public void sendDisorderBroadcastJava(View view) { /** * 接收者是这样订阅的:怎么订阅,就怎么发送 * IntentFilter intentFilter = new IntentFilter(); * intentFilter.addAction("my.MyBroadcastReceiver.custom.action2"); * intentFilter.addDataScheme("Beyond"); // 注意:这里不能加 : */ Intent intent = new Intent(); intent.setAction("my.MyBroadcastReceiver.custom.action2"); intent.setData(Uri.parse("Beyond:香港著名殿堂级乐队灵魂人物黄家驹")); // 注意:要加 : intent.putExtra("music", "海阔天空 作词作曲 黄家驹"); sendBroadcast(intent); } /** * Java方式订阅接收者后 必须要解除订阅 */ @Override protected void onDestroy() { super.onDestroy(); if (myBroadcastReceiver != null) unregisterReceiver(myBroadcastReceiver); }
定义MyBroadcastReceiver接收者:
package liudeli.croadcast1; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; /** * 定义 接收者 */ public class MyBroadcastReceiver extends BroadcastReceiver { private final String TAG = MyBroadcastReceiver.class.getSimpleName(); /** * 接收的方法 * @param context 传递过来的上下文 * @param intent 传递过来的意图,可以获取很多信息 */ @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "intent.getAction():" + intent.getAction()); Log.d(TAG, "intent.getDataString():" + intent.getDataString()); // 真实开发中是这样写的 if ("my.MyBroadcastReceiver.custom.action2".equals(intent.getAction())) { String data = intent.getDataString(); String[] dataArray = data.split(":"); Log.d(TAG, "data:" + dataArray[1]); Log.d(TAG, "music:" + intent.getStringExtra("music")); } else if ("xxx.action".equals(intent.getAction())) { // 做相应的业务逻辑处理 // ... } else if ("xxx.action".equals(intent.getAction())) { // 做相应的业务逻辑处理 // ... } } }
Log日志打印:
12-17 07:37:24.002 3214-3214/liudeli.croadcast1 D/MyBroadcastReceiver: intent.getAction():my.MyBroadcastReceiver.custom.action2
12-17 07:37:24.002 3214-3214/liudeli.croadcast1 D/MyBroadcastReceiver: intent.getDataString():Beyond:香港著名殿堂级乐队灵魂人物黄家驹
12-17 07:37:24.002 3214-3214/liudeli.croadcast1 D/MyBroadcastReceiver: data:香港著名殿堂级乐队灵魂人物黄家驹
12-17 07:37:24.002 3214-3214/liudeli.croadcast1 D/MyBroadcastReceiver: music:海阔天空 作词作曲 黄家驹
AndroidManifest.xml订阅方式 与 Java订阅方式,是一样的,只是代码语法稍微有点差别而已:
/** * 【Java代码方式订阅 接收者】
* 唯一可以new的组件就是 广播 接收者 */ myBroadcastReceiver = new MyBroadcastReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("my.MyBroadcastReceiver.custom.action2"); intentFilter.addDataScheme("Beyond"); // 注意:这里不能加 : registerReceiver(myBroadcastReceiver, intentFilter);
<!-- 订阅(Xml形式订阅接收者) 注意:订阅的是接收者,和广播发送没有半毛钱关系 --> <receiver android:name=".MyBroadcastReceiver"> <intent-filter> <!-- Action这是必写的 --> <action android:name="my.MyBroadcastReceiver.custom.action" /> <!-- 这个可有可无,一旦加了,发送者也必须要设置 --> <data android:scheme="EXO" /> <!-- 注意:这里不能加 : --> </intent-filter> </receiver>