一、BroadcasReceivert简介
BroadcastReceiver是Android系统的四大组件之一,它适用于接收程序所发出的Broadcast Intent并作出相应的,程序启动BroadcasReceivert只需要两步:
1)创建需要启动的BroadcasReceivert的Intent;
2)调用Context的sendBroadcast()或sendOrderBroadcast()方法来启动指定的BroadcasReceivert;
注意:BroadcasReceivert本质上是一个系统级的监听器,他专门监听各程序发出的Broadcast,因此他拥有自己的进程,只要存在与之匹配的Intent被广播出来,BroadcasReceivert总会被激发。
二、BroadcasReceivert的两种注册模式
BroadcasReceivert用于监听被广播的事件必须被注册,有两种方法:
1)、在应用程序的代码中注册
注册BroadcastReceiver: registerReceiver(receiver,filter);
取消注册BroadcastReceiver: unregisterReceiver(receiver);
比如注册:
IntentFilter filter =new IntentFilter("com.example.broadcast.RECEIVED");
SmsReceiver receiver =new SmsReceiver();
registerReceiver(receiver, filter);
当BroadcastReceiver更新UI,通常会使用这样的方法注册。启动Activity时候注册 BroadcastReceiver,广播监听的区间就是注册广播的activity生命周期内,当activity销毁,会取消广播注册监听。
2)、在androidmanifest.xml当中注册
<span style="font-family:FangSong_GB2312;"><receiver>
<intent-filter>
<action Android:name = "android.intent.action.PICK"/>
</intent-filter>
</receiver></span>
静态注册时长驻型广播,应用程序退出后,如果有信息广播来,程序也会被系统调用自动运行。
三、广播的发送
每当Broadcast事件发生后,系统会创建对应的BroadcastReceiver实例,并自动触发onReceiver()方法,onReceiver()方法执行完后,BroadcastReceiver实例就会被销毁。
注意:onReceiver()方法中尽量不要做耗时操作,如果onReceiver()方法不能在10秒之内完成事件的处理,Android会认为改程序无响应,也就弹出我们熟悉的ANR对话框。如果我们需要在接收到广播消息后进行一些耗时的操作,我们可以考虑通过Intent启动一个Server来完成操作,不应该启动一个新线程来完成操作,因为BroadcastReceiver生命周期很短,可能新建线程还没执行完,BroadcastReceiver已经销毁了,而如果BroadcastReceiver结束了,他所在的进程中虽然还有启动的新线程执行任务,可是由于该进程中已经没有任何组件,因此系统会在内存紧张的情况下回收该进程,这就导致BroadcastReceiver启动的子线程不能执行完成。
<span style="font-family:FangSong_GB2312;">public class MainActivity extends Activity{
private Button but;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
but = (Button) findViewById(R.id.but);
but.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("com.example.broadcast.RECEIVED");
intent.putExtra("msg", "简单消息");
sendBroadcast(intent);
}
});
}
}</span>
核心代码就是onClick()点击事件内部的代码。<span style="font-family:FangSong_GB2312;">public class SmsReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "点击者===:"+intent.getStringExtra("msg"), Toast.LENGTH_LONG).show();
}
}</span>
是不是很简单,当BroadcastReceiver接收到广播之后就打印一条Toast。
广播的大概原理:
广播是怎么发送的?又是怎么接收的?我们知道,只有先注册了某个广播之后,广播接收者才能收到该广播。广播注册的一个行为是将自己感兴趣的IntentFilter注册到Android系统的AMS(ActivityManagerService)中,里面保存了一个IntentFilter列表。广播发送者将自己的IntentFilter 的action行为发送到AMS中,然后遍历AMS中的IntentFilter列表,看谁订阅了该广播,然后将消息遍历发送到注册了相应IntentFilter的Activity或者Service中-----也就是会调用抽象方法onReceive()方法。其中AMS起到了中间桥梁作用。
1)第一种不是常驻型广播,也就是说广播跟随注册他的Activity的生命周期。
2)第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
(下面会给出代码示例,感兴趣的读者可以下载下来运行体会一下。)http://download.youkuaiyun.com/detail/gjnm820/9516899