三明网站seo,长春市住房和城乡建设局网站,管理咨询公司名字起名大全,网站建设策略书目录 一、Broadcast 的定义
Broadcast 是一种广泛运用的、在应用程序之间传输信息的机制#xff0c;Android 中的广播与传统意义上的电台广播类似#xff0c;一个广播可以有任意个接收者#xff0c;当然也可能不被任何应用程序所接收。广播机制是一个典型的发布-订阅模式Android 中的广播与传统意义上的电台广播类似一个广播可以有任意个接收者当然也可能不被任何应用程序所接收。广播机制是一个典型的发布-订阅模式也就是观察者模式。
广播机制最大的特点是发送方不关心接收方是否接受到数据也不关心接收方是如何处理数据的通过这样的方式来达到接、收双方的完全解耦。
一广播的三要素
广播Broadcast用于发送广播广播接收器BroadcastReceiver用于接收广播意图内容Intent用于保存广播相关信息的媒介
二广播的分类
普通广播有序广播本地广播Sticky 广播
二、普通广播
普通广播是完全异步的通过 Context 的 sendBroadcast() 函数来发送消息传递的效率比较高但所有的 receivers接收器的执行顺序不确定。缺点是接收者不能将处理结果传递给下一个接收者并且无法终止广播 Intent 的传播直到没有与之匹配的广播接收器为止。
下面我们来写一个普通广播
step1定义一个广播接收器
public class MyBroadcastReceiver extends BroadcastReceiver {private static final String TAG MyBroadcastReceiver;Overridepublic void onReceive(Context context, Intent intent) {if (intent null) {return;}String name intent.getStringExtra(name);Log.d(TAG, name);}
}step2注册广播
注册广播的方式有两种静态注册 和 动态注册
静态注册即在 AndroidManifest.xml 文件中进行注册
receiverandroid:name.MyBroadcastReceiverandroid:enabledtrueandroid:exportedtrueintent-filteraction android:namecom.cyy.broad //intent-filter
/receiverenabled 设置为 true 意味着能够接受到信息exported 为 true 意味着能够接收到外部 apk 广播发送的信息。
动态注册即在代码中进行注册 public void registerHelloBroadcast() {receiver new MyBroadcastReceiver();registerReceiver(receiver, new IntentFilter(com.cyy.broad));}如果使用动态注册那么不要忘记在执行 onDestroy 时注销广播 Overrideprotected void onDestroy() {super.onDestroy();if (receiver ! null) {unregisterReceiver(receiver);}}step3发送广播 sendBroadcast()
如果是静态注册的广播
Intent intent new Intent(com.cyy.broad);
ComponentName componentName new ComponentName(com.chenyouyu.broadcastdemo,com.chenyouyu.broadcastdemo.MyBroadcastReceiver);
intent.setComponent(componentName);
intent.putExtra(name, hello);
sendBroadcast(intent);如果是动态注册的广播
Intent intent new Intent(com.cyy.broad);
intent.putExtra(name, hello);
sendBroadcast(intent);当我们调用了 sendBroadcast() 后会调用 MyBroadcastReceiver 的 onReceive 函数。
三、有序广播
有序广播通过 Context.sendOrderedBroadcast() 来发送所以的广播接收器按照优先级依次执行广播接收器的优先级通过 receiver 的 intent-filter 中的 android:priority 属性来设置数值越大优先级越高参数为 -1000 ~ 1000。当广播接收器接收到广播后可以使用 setResult() 函数来将结果传递给下一个广播接收器然后通过 getResult() 函数来取得上一个广播接收器返回的结果并可以使用 abortBroadcast() 函数来让系统丢弃该广播使该广播不再传递到别的广播接收器。
设置广播的优先级代码示例 receiverandroid:name.MyBroadcastReceiverandroid:enabledtrueandroid:exportedtrueintent-filter android:priority100action android:namecom.cyy.broad //intent-filter/receiver关于 android:priority 的取值范围官网给出的是 -1000 ~ 1000 但是看到很多人设置成2147483647Integer.MAX_VALUE这个值可能因为 android:priority 的属性值是 integer 类型系统会拿这个值和其他值做比较结果怎么都是它最大了。
发送有序广播
sendOrderedBroadcast(intent,null);四、本地广播
在 21 版的 Support v4 包中新增本地广播也就是 LocalBroadcastManager 。之前广播都是全局的所有应用程序都可以接收到这样就会带来安全隐患。但是有的时候我们并不需要把自己的应用内的信息广播给所有应用而只是进程内使用现在使用 Support v4 包中的 LocalBroadcastManager 就能够实现限于应用内的广播。
它的用法很简单只需要把调用 context 的 sendBroadcast、registerReceiver、unregisterReceiver 的地方替换为 LocalBroadcastManager.getInstance(Context context) 中对应的函数即可
函数作用LocalBroadcastManager.getInstance(context).registerReceiver(receiver,intentFilter)注册 ReceiverLocalBroadcastManager.getInstance(context).unregisterReceiver(receiver)注销 ReceiverLocalBroadcastManager.getInstance(context).sendBroadcast(intent)发送异步广播LocalBroadcastManager.getInstance(context).sendBroadcastSync(intent)发送同步广播
五、sticky 广播
sticky 广播通过 Context.sendStickyBroadcast() 函数来发送用此函数发送的广播会一直滞留当有匹配此广播的广播接收器被注册后该广播接收器就会收到此条广播。使用此函数发送广播时需要获得 BROADCAST_STICKY 权限
uses-permission android:nameandroid.permission.BROADCAST_STICKY/sendStickyBroadcast() 只保留最后一条广播并且一直保留下去这样即使已经有广播接收器处理了该广播当再有匹配的广播接收器被注册时此广播仍会被接收。如果你只想处理一遍该广播可以通过 removeStickyBroadcast() 函数实现。 参考资料
《Android开发进阶从小工到专家》何红辉