BroadcastReceiver也就是“广播接收者”,它就是用来接收来自系统和应用中的广播。
定义广播接收者的地址,就可以通过地址将广播放送出去到接收者。
自定义一个BroadcastReceiver
public class MyReceiver extends BroadcastReceiver {
private static final String TAG = "MyReceiver";
@Override
public void onReceive(Context context, Intent intent) {
String data = intent.getStringExtra("data");
Log.i(TAG, data);
}
}
广播分静态注册,动态注册
1.静态注册:在AndroidManifest.xml文件中配置
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.MyReceiver"></action>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
这种注册是永久的,当广播信息发送来时,应用是关闭状态也会也会调用到该广播接收者。
2.动态注册 通过代码注册,生命周期跟随应用的生命周期。
MyReceiver m= new MyReceiver();
IntentFilter ifm = new IntentFilter();
ifm.addAction("android.intent.action.MY_RECEIVER");
registerReceiver(m,ifm);
在应用关闭是应用解除注册的广播地址,不然会出现异常
unregisterReceiver(m);
广播接收者信息设置完了,我们就可以发送广播了:
Intent i = new Intent("android.intent.action.MyReceiver");
i.putExtra("data", "广播信息");
sendBroadcast(i);
运行后:
12-12 16:42:23.378 27877-27877/com.cn.broadcastreceiver I/MyReceiver: 广播信息
可以给多个广播接收者注册相同的地址,每个广播接收者都可以收到消息,且互不影响,这种为普通广播,还有一种为有序广播,通过设置优先级来传播。
普通广播:
MyReceiver m= new MyReceiver();
IntentFilter ifm = new IntentFilter();
ifm.addAction("android.intent.action.MY_RECEIVER");
registerReceiver(m,ifm);
TReceiver t= new TReceiver();
IntentFilter ift = new IntentFilter();
ift.addAction("android.intent.action.MY_RECEIVER");
registerReceiver(t,ift);
12-12 16:55:31.646 4031-4031/com.cn.broadcastreceiver I/MyReceiver: 广播信息
12-12 16:55:31.646 4031-4031/com.cn.broadcastreceiver I/TReceiver: 广播信息
有序广播:
在AndroidManifest.xml文件中配置
<receiver android:name=".MyReceiver" **android:priority="1000"**></receiver>
<receiver android:name=".TReceiver" **android:priority="999"**></receiver>
android:priority属性,并且依次减小。这个属性的范围在-1000到1000,数值越大,优先级越高。
MyReceiver m= new MyReceiver();
IntentFilter ifm = new IntentFilter();
ifm.addAction("android.intent.action.MY_RECEIVER");
registerReceiver(m,ifm);
TReceiver t= new TReceiver();
IntentFilter ift = new IntentFilter();
ift.addAction("android.intent.action.MY_RECEIVER");
registerReceiver(t,ift);
Intent i = new Intent("android.intent.action.MY_RECEIVER");
i.putExtra("data", "广播信息");
sendOrderedBroadcast(i,"scott.permission.MY_BROADCAST_PERMISSION");
使用sendOrderedBroadcast方法发送有序广播时,需要一个权限参数,如果为null则表示不要求接收者声明指定的权限,如果不为null,则表示接收者若要接收此广播,需声明指定权限。
在AndroidMainfest.xml中定义一个权限:
<permission android:protectionLevel="normal" android:name="scott.permission.MY_BROADCAST_PERMISSION"></permission>
使用该权限:
<uses-permission android:name="scott.permission.MY_BROADCAST_PERMISSION"></uses-permission>
在MyReceiver停止该广播,TReceiver接收不到了。
public class MyReceiver extends BroadcastReceiver {
private static final String TAG = "MyReceiver";
@Override
public void onReceive(Context context, Intent intent) {
String data = intent.getStringExtra("data");
Log.i(TAG, data);
//停止该广播
abortBroadcast();
}
}
12-12 17:04:12.701 11539-11539/com.cn.broadcastreceiver I/MyReceiver: 广播信息