Android之BroadcastReceiver分析
Android之BroadcastReceiver分析
飞上北极星 发表于7个月前
Android之BroadcastReceiver分析
  • 发表于 7个月前
  • 阅读 2
  • 收藏 0
  • 点赞 0
  • 评论 0

华为云·免费上云实践>>>   

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
博文 140
码字总数 0
×
飞上北极星
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: