• BroadcastReceiver的用法笔记


    Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件。

    首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用 Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent对象以广播方式发送出去。

    当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则就会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive()方法。

    注册BroadcastReceiver有两种方式:

    一,静态的在AndroidManifest.xml中用<receiver>标签生命注册,并在标签内用<intent- filter>标签设置过滤器

    二,动态的在代码中先定义并设置好一个 IntentFilter 对象,然后在需要注册的地方调Context.registerReceiver()方法,如果取消时就调用 Context.unregisterReceiver()方法。如果用动态方式注册的BroadcastReceiver的Context对象被销毁时,BroadcastReceiver也就自动取消注册了。(特别注意,有些可能需要后台监听的,如短信消息)

    另外,若在使用sendBroadcast()的方法是指定了接收权限,则只有在AndroidManifest.xml中用<uses- permission>标签声明了拥有此权限的BroascastReceiver才会有可能接收到发送来的Broadcast。同样,若在注册BroadcastReceiver时指定了可接收的Broadcast的权限,则只有在包内的AndroidManifest.xml中 用<uses-permission>标签声明了,拥有此权限的Context对象所发送的Broadcast才能被这个 BroadcastReceiver所接收。

    1.静态注册BroadcastReceiver:

    静态注册比动态注册麻烦点,先新建一个类继承BroadcastReceiver,如:

    /*

    * 接收静态注册广播的BroadcastReceiver,

    * step1:要到AndroidManifest.xml这里注册消息

    *      

                

    <receiver android:name=".SmsReceiver" > 

       <intent-filter android:priority="100"> 

        <action android:name="android.provider.Telephony.SMS_RECEIVED" />                    

       </intent-filter> 

    </receiver>

    step2:定义消息的字符串

    step3:通过Intent传递消息来驱使BroadcastReceiver触发

    */

    public class clsReceiver2 extends BroadcastReceiver{

    @Override

    public void onReceive(Context context, Intent intent) {

    String action = intent.getAction();

    Toast.makeText(context, "静态:"+action, 1000).show();

    }

    }

    然后到AndroidManifest.xml 添加receive标签

    <receiver android:name="clsReceiver2"> 

    <intent-filter> 

    <action 

    android:name="com.testBroadcastReceiver.Internal_2"/> 

    </intent-filter> 

    </receiver>

    第一个name是类名,即你的继承BroadcastReceiver的类的名字,里面实现了BroadcastReceive的onReceive()方法,来处理你接到消息的动作。

    第二个name是action的名称,即你要监听的消息名字(其它消息都会被过滤不监听)。

    2.动态注册BroadcastReceiver:

      主要代码部分为:

         IntentFilter intentFilter = new IntentFilter();

    intentFilter.addAction(String); //为BroadcastReceiver指定action,即要监听的消息名字。

         registerReceiver(MyBroadcastReceiver,intentFilter); //注册监听

         unregisterReceiver(MyBroadcastReceiver); //取消监听

    (一般:在onStart中注册,onStop中取消unregisterReceiver)

         private class MyBroadcastReceive extends BroadcastReceiver

         {

               public void onReceive(Context context, Intent intent)

               {

                   String action = intent.getAction();

                    if(intent.ACTION_BATTERY_CHANGED.equals(action)) //判断是否接到电池变换消息 

                    {

                       //处理内容

                     }

                }

          }

    ========================================================================

    Broadcast:

    发送广播消息,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用 Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent对象以广播方式发送出去。

    例如:

    Intent intent = new Intent(INTENAL_ACTION_3);

    intent.putExtra("Name", "hellogv");

    intent.putExtra("blog", "http://www.cnblogs.com/feary/");

    sendBroadcast(intent);//传递过去

    普通广播(Normal Broadcast)

    普通广播对于多个接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响。对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作。

    特点:同级别接收广播是随机的(无序的)

                  级别低的后收到广播

                   接收器不能截断广播的继续传播也不能处理广播

                  同级别动态注册高于静态注册

    有序广播(Ordered Broadcast)

    有序广播比较特殊,它每次只发送到优先级较高的接收者那里,然后由优先级高的接受者再传播到优先级低的接收者那里,优先级高的接收者有能力终止这个广播。

    特点:同级别接收广播是随机的(无序的)

                  级别低的后收到广播

                   接收器能截断广播,高级别的广播能决定是否截断

                  接收器可以处理广播

                  同级别动态注册高于静态注册

    是通过Context.sendOrderedBroadcast来发送。所有的receiver依次执行。 

    BroadcastReceiver可以使用setResult系列函数来结果传给下一个BroadcastReceiver,通过getResult系列函数来取得上个BroadcastReceiver返回的结果,并可以abort系列函数来让系统丢弃该广播让,使用该广播不再传送到别的BroadcastReceiver。 

    可以通过在intent-filter中设置android:priority属性来设置receiver的优先级。优先级相同的receiver其执行顺序不确定。 

    如果BroadcastReceiver是代码中注册的话,且其intent-filter拥有相同android:priority属性的话,先注册的将先收到广播。 

    接收短信的广播是有序广播,因此可以设置你自己的广播接收器的级别高于系统原来的级别,就可以拦截短信,并且不存收件箱,也不会有来信提示音。 

     

    实现方法是: 

     

     

     

    <receiver android:name=".SmsReceiver" > 

       <intent-filter android:priority="100"> 

        <action android:name="android.provider.Telephony.SMS_RECEIVED" />                    

       </intent-filter> 

    </receiver> 

     

     

    里面的android:priority="100"就是设定广播接收器的级别,这个值从1000-1000,数值越大,优先级别就越高。

     

  • 相关阅读:
    设计模式之观察者模式
    设计模式之模板方法模式
    设计模式之代理模式(全面讲解)
    设计模式之工厂模式(包含三种模式)
    设计模式之单例模式(包含三种方式)
    opencv+vs2015 堆内存析构异常
    用python来压缩文件
    GPT安装ubuntu的问题
    Two Sum and add Two Numbers
    [LeetCode] Palindrome Partitioning II
  • 原文地址:https://www.cnblogs.com/feary/p/5382528.html
Copyright © 2020-2023  润新知