BroadcastReceiver

xzw 2016-06-06

广播是一种消息机制,有消息的发送者和接收者,广播可实现组件间通讯,进程间通讯。

广播的发送

全局广播分类

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);

相关推荐