最近也是用到了android中的广播,相对以前对广播有了一点比较形象的理解,内容可能参考了许多了网络和书本上搜集的资料。
1.介绍
广播是一种广泛运用的在应用程序之间传输信息的机制 ,在 Android 里面有各种各样的Intent(广播),比如电池的使用状态,U盘或者SD卡的插拔,电话的接收和短信的接收都会产生一个广播,我们也可以监听这些广播并针对这些广播做出程序逻辑的处理。
2.广播机制的实现
广播需要发送者和接受者两个要素:广播接收者--broadcastreceiver(触发器),广播发送者---sendbroadcast。
2.1广播接收者( BroadcastReceiver )
触发器( BroadcastReceiver )用于接收广播 Intent ,通常一个广播 Intent 可以被注册了此Intent 的多个触发器所接收,而 触发器可以对发送出来的广播进行过滤接收并响应。
触发器组件派生自android.content.BroadcastReceiver的子类型,它的实现集中在BroadcastReceiver.onReceiver方法中,触发器组件对象被构造出来后,通常只执行BroadcastReceiver.onReceiver方法,就会结束它的生命周期。
触发器组件对象也是在应用进程中的主线程(UI线程)中被创造,因此方法BroadcastReceiver.onReceiver的执行必须是同步且快速的,否则会阻塞用户交互。
2.1.1 注册广播
触发器如果要接收到广播信息就必须注册想要监听的广播(注册广播就是说触发器只对指定名字的广播感兴趣,其他名字的广播一律不收)。
注册广播的两种方法:
1. 在应用程序的配置文件(androidManfiest.xml)中注册,例如,
<receiver android:name="myRecevice"> //继承android中BroadcastReceiver类的类名
<intent-filter>
<action android:name="com.dragon.net"></action> //使用过滤器,只接收指定action名字的广播
</intent-filter>
</receiver>
2. 在activity的生命周期里注册
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(String); //为BroadcastReceiver实例对象指定action,使之用于接收同action的广播
registerReceiver(BroadcastReceiver,intentFilter);//BroadcastReceiver是实例对象
注册完了触发器还需要重新生成一个android.content.BroadcastReceiver的实例对象(也可以继承BroadcastReceiver类新建一个触发器类,重写父类BroadcastReceiver的 onreceive方法,再生成一个新建触发器的实例对象)。例如,
public class Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String name = intent.getExtras().getString("name");
Log.i("Recevier1", "接收到:"+name);
}
}
PS:在应用程序配置文件中注册广播的方法也叫做冷插拔,就是当系统发出本应用注册的广播的时候不管应用程序有没有处于前台和用户进行交互,都会接受到这个广播,执行onReceive中的方法。
(没有用过这种注册方法,( ⊙ o ⊙ )!)
2.2 广播发送者
广播 Intent 的发送是通过调用Context.sendBroadcast() 、 Context.sendOrderedBroadcast() 来实现的。
例如:
Intent intent = new Intent(INTENAL_ACTION_3);
intent.putExtra("Name", "hellogv");
intent.putExtra("Blog", "mybog is heheh ");
sendBroadcast(intent);//传递过去