当前位置: 代码迷 >> Android >> android 之 播音相关
  详细解决方案

android 之 播音相关

热度:94   发布时间:2016-05-01 18:42:15.0
android 之 广播相关
感谢:http://www.devdiv.com/home.php?mod=space&uid=14682&do=blog&id=3776

在android中,通过广播(broadcast)可以通知其他广播接受者某个事件发生了。比如电源强度,信号强度等。
Broadcast机制是基于一种注册方式的,Broadcast Receiver将其特征描述并注册在系统中。根据注册时机,可以分为两类,网上有人称之为静态注册和动态注册。
静态注册,就是Broadcast Receiver的相关信息写在配置文件中,系统会负责在相关事件发生的时候及时通知到该Broadcast Receiver。这种模式适合于这样的场景:某事件发生
-> 通知Broadcast -> 启动相关处理应用。比如,监听来电、邮件、短信之类的,都隶
属于这种模式。 这个方式实现如下:
(1)接收广播
Public class MyBroadcastReceiver extends BroadcastReceiver { Public void onReceive(Context context, Intene intent){ // TODO}

(2)发送广播
 Intent it = new Intent(NEW_BROADCAST_FILTER); sendBroadcast(it);


(3)配置广播
在receiver的action中定义了该receiver能够接受的广播,Manifest.xml定义部分:
<receiver android:name=”.MyBroadcastReceiver”> <intent-filter><action android:name= NEW_BROADCAST_FILTER /></intent-filter></receiver>


    动态注册,注册这样的事情都是由应用自己来处理的,通常是在OnResume事
件中通过registerReceiver进行注册,在OnPause等事件中通过unregisterReceiver取消注
册,通过这种方式使其能够在运行期间保持对相关事件的关注。比如,判断网络变化,有些应用会在运行期间关注网络状况变化的需求,使其可以在有网络的时候优先使用网络,在其他情况下,首先通过本地数据。而这样的监听,只需要在其工作状态下保持就好,不运行的时候,管你是天大的网路变化,与我何干。其模式可以归结为:启动应用 -> 监听事件 -> 发生时进行处理。 动态注册广播方式如下:
(1)声明一个BroadcastReceiver
BroadcastReceiver mReceiver=new BroadcastReceiver(){Public void onReceive(Context context,Intent intent){ //收到Broadcast会跑到这里         }}

(2)  OnResume时,通过registerReceiver注册。
IntentFilter mfilter=new IntentFilter();mfilter.addAction(NEW_BROADCAST_FILTER);registerReceiver(mReceiver,mfilter);

(3)OnPause时,通过unregisterReceiver反注册。
unregisterReceiver(mReceiver);

android中发送广播有两种方式,Context.sendBroadcast和Context.sendOrderedBroadcast,前者发出的称为Normal broadcast,所有关注该消息的Receiver,都有机会获得并进行处理;后者放出的称作Ordered broadcasts,顾名思义,接受者需要按资排辈,排在后面的能否收到广播,需要看前面的处理方式,如果前面的Receiver阻止了这个消息继续广播,排在后面的就不会在接收到这个广播,短信广播就是Ordered broadcasts。
<receiver android:name=".SmsReceiver">       <intent-filter android:priority="1999">            <action android:name="android.provider.Telephony.SMS_RECEIVED"/>         </intent-filter></receiver>

Ordered broadcasts根据priority值确定优先级,值越大优先级越高,如果你的短信程序中priority最大,接收到短息广播后阻止了其继续广播,就达到了拦截短信的效果。
最后需要注意的是,当Broadcast Receiver接收到相关的消息,在OnReceive中不要执行很消耗时间(通常不大于5秒)的操作,通常把消耗时间的操作放到一个Service中,在OnReceive中启动该Service。
  相关解决方案