Android之BroadcastReceiver分析

来源:互联网 发布:教画画的软件 编辑:程序博客网 时间:2024/06/05 18:06

Android之BroadCastReceiver分析

BroadcastReceiver作为android系统的四大组件(Service,Activity,Intent,BroadcastReceiver)之一,重要性不言而喻。本质上BroadcastReceiver这种组件是一种全局的监听器,主要是用于监听系统全局的广播消息,很利于不同的组件之间传递消息。那么本文就主要从五个方面来介绍android的广播

1、BroadcastReceiver简介

2、广播的两种注册方法(动态注册和静态注册)

3、发送广播(普通广播和有序广播)

4、接受广播

5、利用系统广播

一、BroadcastReceiver简介

Android的BroadcastReceiver主要是为了各种服务而存在的,响应系统的消息,回应系统的各种状态。所以说学习并理解BroadcastReceiver需要重点的理解Service,这一点很重要。

程序完成BroadcastReceiver功能一共三个重点:
1.创建需要启动的BroadcastReceiver的Intent(相当于是注册广播)
2.调用Content的sendBroadcast()或sendOrderedBroadcast()方法来启动指定的BroadcastReceiver。(相当于是发送广播)

3.重写了 BroadcastReceiver的onReceive(Context ontext,Intentintent)方法响应指定的广播

二、广播的两种注册方法(动态注册和静态注册)

注册广播本质上就是告诉android系统,自己定义的这个BroadcastReceiver对哪些intent有作用,当出现这样的广播(本质上就是intent)的时候自己该有反应了(onReceive方法启动)。

注册一共有两种方法:

源码动态注册:
使用代码进行指定,调用BrordcastReceiver的Context的registerReceiver(BroadcastReceiver,IntentFilterfilter)方法指定。如

IntentFilter filter = newIntentFilter("android.provider.Telphony.MS_RECEIVED");IncomingSMSReceiver receiver = new IncomingSMSReceiver();registerReceiver(receiver,filter);
静态注册:

在AndroidManifest.xml文件中配置,如

<receiver android:name =".IncomingSMSReceiver"><intent-filter><action android:name= "android.provider.Telephony.SMS_RECEIVED"/></intent-filter></receiver>
动态注册与静态注册的区别:

动态注册:当用来注册的Activity关掉后,广播也就失效了。

静态注册:无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。也就是说哪怕app本身未启动,该app订阅的广播在触发时也会对它起作用

三、发送广播

Android系统中的广播分为两种:普通广播和有序广播

普通广播:通过Context.sendBroadcast(Intent myIntent)发送。在逻辑上的同一时刻所有注册的广播接受者都能够收到,没有特色。对比之下有序广播就功能更加全面。

有序广播:通过Context.sendOrderedBroadcast(intent, receiverPermission)发送。其实想针对广播接受者而言的。接受者在定义广播的时候表明自己的优先级,根据优先级获得两种能力:

1、优先级高的先获得广播

2、较高优先级的广播接收者可以传值给较低优先级的广播接收者,甚至直接通过abortBroadcast()方法截断广播使其他的接收者无法收到该广播

发送普通广播:

@Override           public void onClick(View v)           {              // 创建Intent对象              Intentintent = newIntent();              // 设置Intent的Action属性              intent.setAction("org.crazyit.action.CRAZY_BROADCAST");              intent.putExtra("msg", "简单的消息");              // 发送广播              sendBroadcast(intent);           }

发送有序广播:

@Override           public void onClick(View v)           {              // 创建Intent对象              Intentintent = newIntent();              intent.setAction("org.crazyit.action.CRAZY_BROADCAST");              intent.putExtra("msg", "简单的消息");              // 发送有序广播              sendOrderedBroadcast(intent,null);           }

有序广播的静态注册:

<receiver android:name=".MyReceiver">           <intent-filter android:priority="20">              <action android:name="org.crazyit.action.CRAZY_BROADCAST"/>           </intent-filter>           </receiver>       <receiver android:name=".MyReceiver2">           <intent-filter android:priority="0">              <action android:name="org.crazyit.action.CRAZY_BROADCAST" />           </intent-filter>           </receiver>  


四、接收广播
接受广播需要两个步骤:

1>注册该广播接收者(见上面两种注册方法)

2>写一个继承BroadCastReceiver的类,重写onReceive()方法,广播接收器仅在它执行这个方法时处于活跃状态。当onReceive()返回后,它即为失活状态,注意:为了保证用户交互过程的流畅,一些费时的操作要放到线程或者Service中

public classMyReceiver2 extends BroadcastReceiver{    @Override    public void onReceive(Contextcontext, Intent intent)    {       Bundlebundle = getResultExtras(true);       // 解析前一个BroadcastReceiver所存入的key为first的消息       Stringfirst = bundle.getString("first");       Toast.makeText(context,"第一个Broadcast存入的消息为:"           +first, Toast.LENGTH_LONG).show();    }}

每次系统Broadcast事件发生后,系统就会创建对应的BroadcastReceiver的实例,并自动触发它的onReceive()方法,onReceive()方法执行完后,BroadcastReceiver的实例就会被销毁。

【注意】
如果BroadcastReceiver的onReceive()方法不能在10秒内执行完成,Android会认为该程序无响应。所以不要在BroadcastReceiver的onReceive()方法里执行一些耗时的操作,否则会弹出ANR(Application No Response)的对话框。
如果确实需要根据Broadcast来完成一项比较耗时的操作,则可以考虑通过 Intent启动一个Service来完成该操作。不应考虑使用新线程去完成耗时的操作,因为BroadcastReceiver本身的生命周期很短,可能出现的情况是子线程还没有结束,BroadcastReceiver就已经退出了。


五、利用系统广播

利用系统广播实现开机自动启动,或者监听短信等,这都是android提供出来的“广播”

0 0
原创粉丝点击