关闭

Android开发之BroadcastReceiver详解

标签: BroadcastReceiverAndroid王尊宽
153人阅读 评论(0) 收藏 举报
分类:

一、引言

在Android开发中,BroadcastReceiver是常常用到的。它主要用来接收系统广播并进行相应的事件处理。在开始正式介绍BroadcastReceiver组件之前,我们先讲一下Android中的广播机制,以便对该组件的使用原理和使用方法有更深层次的理解。

Android系统会经常发送出一些广播,例如在系统开机时会发出一条广播,接收者在接收到广播之后完成系统各个模块的参数初始化或者播放开机音乐等。当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度。这样的例子很多,不再一一列述。

请注意:广播跟通知不太一样,广播的发出时它不管接收者是谁,只要能匹配就能接受和进行事件处理。如下图所示:

        

      Android中的广播机制设计的非常出色,很多事情原本需要开发者亲自操作的,现在只需等待广播告知自己就可以了,大大减少了开发的工作量和开发周期。而作为应用开发者,就需要数练掌握Android系统提供的一个开发利器,那就是BroadcastReceiver。下面将着通过一个实例---接受短信广播,着重介绍一下BroadcastReceiver具体的创建和使用方法。

二、BroadcastReceiver分类

广播接收器通常初始化独立的组件或者在onReceive()方法中发送通知给用户。那么,用于接收广播的广播接收器有以下两类。

1)普通广播:使用context.sendBroadcast()方法进行发送,它是完全异步的操作。广播接收者通常以未定义的顺序运行,这样会高效运行。但是,接收者不能使用结果或者终止API。

2)有序广播:使用context.sendOrderedBroadcast()方法发送,每次只发送给一个接收者。这样的话,前面的接收者可以为后面的接收者提供一个结果,甚至终止广播以便不将广播传递给后面的接收者。注意一点,具有相同优先级的广播接收者的运行是随意的。

三、BroadcastReceiver创建

首先,要创建一个类,它继承自BroadcastReceiver,并覆写其中的onReceive()方法。

        public class MyReceiver extends BroadcastReceiver {

    private static final String action = "android.provider.Telephony.SMS_RECEIVED";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(action)) {
                Toast.makeText(context,"您有一条短消息,请注意查收。", Toast.LENGTH_SHORT).show();
        }
    }
   }

上面的操作就是当系统接收到一条短息之后,该BroadcastReceiver 类的子类会利用intent.getAction().equals(action)进行匹配。如果配对成功,则说明它可以接收系统短信广播,那么就可以进行接下来的事件处理了。

四、BroadcastReceiver注册

当系统定义了一个BroadcastReceiver广播接收者时,它还不能进行接收广播的处理。这里我们还要对这个类在系统中进行注册,才能发挥其作用。注册,顾名思义,就是要让系统知道系统中存在这么一个广播接收者对象。BroadcastReceiver的注册分为两种:

1)一种是在全局文件manifest.xml中进行注册

<receiver android:name=".MyReceiver">
            <intent-filter >
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
        </receiver>

这样注册的好处是,系统处于非运行状态时也能接收到来自系统的广播。所以,它的耗能、耗电量会多一点。

       2)另一种是在一个Activity中进行注册

registerReceiver(BroadcastReceiver receiver, IntentFilter filter);

参数一为BroadcastReceiver 类对象

参数二为IntentFilter对象

本例中我们就可以这样写:registerReceiver(new MyReceiver(), new IntentFilter(Intent.ACTION_SEND));

以上两种方法都可以完成广播接收器的注册,具体使用哪一个,大家可以自由选择。

总结:上面主要从概念和特点、分类、声明和注册四个方面对广播接收者BroadcastReceiver进行了比较详细的阐述。希望能对初学广播的人带来帮助。



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1576次
    • 积分:116
    • 等级:
    • 排名:千里之外
    • 原创:10篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档