BroadcasReceivert总结

一、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启动的子线程不能执行完成。


下面创建一个Intent对象对外发送一条广播,程序代码如下:
<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()点击事件内部的代码。
下面看一个BroadcastReceiver的具体实现代码:
<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.csdn.net/detail/gjnm820/9516899

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值