学习基于《第一行代码》第五章(郭霖)
一、广播简介
Broadcast Receiver为Android四大组件之一。
主要可以分为两种类型 标准广播和有序广播
- 标准广播
是一种异步的方式来进行传播的,广播发出去之后,所有的广播接收者几乎是同一时间收到消息的。他们之间没有先后顺序可言,而且这种广播是没法被截断的。 - 有序广播 是一种同步执行的广播,在广播发出去之后,同一时刻只有一个广播接收器可以收到消息。当广播中的逻辑执行完成后,广播才会继续传播。
二、接受系统广播
动态注册
-
实现一个广播接收器
public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show(); abortBroadcast(); } }
-
进行动态注册
intentFilter = new IntentFilter(); intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); myBroadcastReceiver = new MyBroadcastReceiver(); registerReceiver(myBroadcastReceiver, intentFilter);
静态注册
还是用上面的MyBroadcastReceiver(可以将其分出到一个新类中),并在manifest文件中增加如下的代码:
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
几个相关解释:
android:exported
此BroadcastReceiver能否接收其他App发出的广播(其默认值是由receiver中有无intent-filter决定的,如果有intent-filter,默认值为true,否则为false);
android:name
此broadcastReceiver类名;
android:permission
如果设置,具有相应权限的广播发送方发送的广播才能被此broadcastReceiver所接收;
android:process
broadcastReceiver运行所处的进程。默认为App的进程。可以指定独立的进程(Android四大组件都可以通过此属性指定自己的独立进程);
三、发送自定义广播
发送标准广播
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent); //这里Intent中的值需要与Broadcast Receiver中添加的action一致,receiver才能收的到
发送有序广播
其实就是改成sendOrderedBroadcast(intent,null);
第二个参数是一个与权限相关的字符串,传入null就行了
这里提一下接受方
需要加上priority属性,该值越大,优先级越高
<receiver android:name=".MyBroadcastReceiver">
<intent-filter android:priority="100" >
<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
如果在onReceiver()方法中调用了abortBroadcast()方法,就表示将这条广播截断。
四、使用本地广播
以上的都属于系统全局广播,即发出的广播可以被其他任何应用程序接收到
为了能够简单地解决广播安全性的问题,Android引入了一套本地广播机制
-
发送:
LocalBroadcastManager localBroadcastManager; localBroadcastManager = LocalBroadcastManager .getInstance(this); //获取实例 Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST"); localBroadcastManager.sendBroadcast(intent); //发送本地广播
-
获取:
LocalReceiver localReceiver; intentFilter = new IntentFilter(); intentFilter.addAction("com.example.broadcasttest.MY_BROADCAST"); localReceiver = new LocalReceiver(); localBroadcastManager.registerReceiver(localReceiver,intentFilter);