广播是一种消息机制,有消息的发送者和接收者,广播可实现组件间通讯,进程间通讯。
广播的发送
全局广播分类
1.发送普通广播
Intent intent=new Intent("123");
sendBroadcast(intent);
2.发送有序广播:
有序广播是:广播接收者根据自己的优先级先后接收广播
优先级:
<receiver android:name="ddd">
<intent-filter android:priority="100"/>
</receiver>
priority范围是:Integer.MIN~Integer.MAX,系统注册Receiver的IntentFIlter的priority的范围-1000~1000。当priority一样时,代码注册的接收器优先于静态注册的接收器,先安装高于后安装的广播接收器。
setResult:函数把结果传给下一个接受者,getResult函数来取得上个BroadcastReceiver返回的结果,
abort:函数来让系统丢弃该广播,使用该广播不再传送到别的BroadcastReceiver。
Intent intent=new Intent("123");
sendOrderedBroadcast(intent,null);
3.发送粘性广播(在android 5.0/api 21中deprecated,不再推荐使用)
粘性广播:这种广播发出后会一直存在,直到有人Context.removeStickyBroadcast移除他,发这种广播的应用要申请BROADCAST_STICKY权限。
Intent intent=new Intent("123");
sendStickyBroadcast(intent);
广播的权限
(尽量不发给第三方,限制别人收)发出者定义权限,接收者申请权限。
发出者
<permission android:name = "com.android.permission.RECV_XXX"/>
sendBroadcast(intent,"com.android.permission.RECV_XXX");
接收者
<uses-permission android:name="com.android.permission.RECV_XXX"></uses-permission>
(尽量不接第三方,限制别人发给我)接收者定义权限,发出者申请权限
接收者
<permission android:name = "com.android.permission.SEND_XXX"/>
<receiver android:name=".XXXReceiver"
android:permission="com.android.permission.SEND_XXX">
</receiver>
发出者
<uses-permission android:name="com.android.permission.SEND_XXX"></uses-permission>
sendBroadcaset(intent)
广播的标志位
intent.addFlags(Intent.FLAG_EXCLUDE_STOPPED_PACKAGES);
从3.1开始广播默认带这个默认带这个标志位。是说,此广播不发给没有运行的应用
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
此广播发给没有运行的广播。
应用内广播
Intent intent = new Intent();
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
增强广播的安全性:
1.不发给第三方,发送广播时,指定特定广播接收器所在的包名,这样指定包中的接收器才会收到,具体是通过intent.setPackage(packageName)指定在。
2.不接受第三方,<receiver android:name="ddd" android:exported="false">将exported属性人为设置成false默认是true,不接收第三方匹配的广播。
3.让广播带上权限认证permission。
4.使用应用内广播机制,即安全又高效。
广播的接收
BroadcastReceiver
//定义
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String name = intent.getStringExtra("name");
}
}
// 注册
// 静态注册
<receiver
android:exported=["true" | "false"]
android:permission="string" >
</receiver>
<receiver android:name=".MyBroadcastReceiver" >
<intent-filter>
<action android:name="BROADCAST_ACTION" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
// 动态注册
mBroadcastReceiver = new MyBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BROADCAST_ACTION);
registerReceiver(mBroadcastReceiver, intentFilter);
// 解注册
unregisterReceiver(mBroadcastReceiver);