• Android 广播机制以及用法详解 (转)


    转:http://blog.sina.com.cn/s/blog_5da93c8f010178zl.html

     
    一、什么是广播?
     
    在android里面有各种各样的广播,比如电池的使用状态,电话的接受和短信的接受都会产生一个广播,应用程序也可以接受广播并做出程序逻辑上的处理。
     
    二、广播的类型
     
    BroadcastReceiver所对应的广播分两类:普通广播有序广播
     
    1、普通广播是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较高,但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播。
     
    普通广播通过Context.sendBroadcast()方法来发送,所有的receivers接收器接收broadcast的顺序不确定。这种方式效率更高,但是BroadcastReceiver无法使用setResult系列getResult系列abort系列API。
     
    2、有序广播是按照接收者声明的优先级别,被接收者依次接收广播。如:A的级别高于B,B的级别高于C,那么广播先传给A,再传给B,最后传给C 。优先级别声明在 intent-filter 元素的android:priority 属性中,数越大优先级别越高。
    可以通过在intent-filter中设置android:priority属性来设置receiver的优先级,优先级相同的receiver其执行顺序不确定。如果BroadcastReceiver是代码中注册的话,且其intent-filter拥有相同android:priority属性的话,先注册的将先收到广播。
    有序广播的接收者可以终止广播Intent的传播,广播Intent的传播一旦终止,后面的接收者就无法接收到广播。
     
    有序广播是通过Context.sendOrderedBroadcast来发送,所有的receiver依次执行。系统会根据接收者声明的优先级别按顺序逐个执行接收者,前面的接收者有权终止广播(BroadcastReceiver.abortBroadcast()),如果广播被前面的接收者终止,后面的接收者就再也无法获取到广播。
    对于有序广播,前面的接收者可以将数据通过setResultExtras(Bundle)方法存放进结果对象,然后传给下一个接收者,下一个接收者通过代码:
    Bundle bundle = getResultExtras(true))
    可以获取上一个接收者存入在结果对象中的数据。
     

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

    实现方法是:

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

    里面的android:priority="2147483647",就是设定广播接收器的级别,intent-filter 标签中的 priority 是设置广播接收器的优先级,网上很多资料都表示,优先级的设置数值为1000~-1000,1000最大,但事实上,当 priority 值为integer 的最大值才时,才是优先级最高的,即  2147483647;当然,“最高”只是限于静态注册。

     两种注册BroadcastReceiver的方法:

      1.在应用程序的代码中进行注册
      
     注册:BroadcastReceiver

        IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");   

        filter.setPriority(2147483647);

       receiver=new BroadReceiver();

       registerReceiver(receiver,filter);
      

      取消注册BroadcastReceiver
        unregisterReceiver(receiver);

      2.在AndroidManifest.xml当中进行注册

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

  • 相关阅读:
    打印当前系统内存使用情况
    swagger 相关
    乐观锁
    mybatis-plus
    kt connect
    flyway
    k8s mandatory.yaml & service-nodeport.yaml
    kubernetes的DNS解析,k8s的DNS解析,service DNS解析,在集群内部通过 Service 的域名形式进行互相通信
    k8s中引入外部服务,k8s中引入外部数据源
    docker 访问外部数据库
  • 原文地址:https://www.cnblogs.com/li-fei/p/4321572.html
Copyright © 2020-2023  润新知