zoukankan      html  css  js  c++  java
  • android BroadcastReceiver 例子

       BroadcastReceiver 用于异步接收广播Intent。主要有两大类,用于接收广播的:

    • 正常广播 Normal broadcasts(用 Context.sendBroadcast()发送)是完全异步的。它们都运行在一个未定义的顺序,通常是在同一时间。这样会更有效,但意味着receiver不能包含所要使用的结果或中止的API。  
    • 有序广播 Ordered broadcasts(用 Context.sendOrderedBroadcast()发送)每次被发送到一个receiver。所谓有序,就是每个receiver执行后可以传播到下一个receiver,也可以完全中止传播——不传播给其他receiver。 而receiver运行的顺序可以通过matched intent-filter 里面的android:priority来控制,当priority优先级相同的时候,Receiver以任意的顺序运行

         下面将详细的阐述如何发送Broadcast和使用BroadcastReceiver过滤接收的过程:

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

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


     

        生命周期
        一个BroadcastReceiver 对象只有在被调用onReceive(Context, Intent)的才有效的,当从该函数返回后,该对象就无效的了,结束生命周期。
        因此从这个特征可以看出,在所调用的onReceive(Context, Intent)函数里,不能有过于耗时的操作,不能使用线程来执行。对于耗时的操作,请start service来完成。因为当得到其他异步操作所返回的结果时,BroadcastReceiver 可能已经无效了。
     
       接受广播
       要写一个能接受广播的应用,需要两点
       1.一个从BroadcastReceiver派生的类,并在 onReceive函数里面进行相关处理。
       

    public class SMSReciver extends BroadcastReceiver {

     private static final String mACTION = "android.provider.Telephony.SMS_RECEIVED";
     
     @Override
     public void onReceive(Context context, Intent intent) {
      // TODO Auto-generated method stub

      if( intent.getAction().equals(mACTION))
      {
       StringBuilder sb = new StringBuilder();
       Bundle bundle = intent.getExtras();
       
       if( null != bundle )
       {    
        Toast.makeText(context,"来短信",Toast.LENGTH_SHORT).show();
       }
      }
      else if( intent.getAction().equals("android.intent.action.PHONE_STATE"))
      {
       Log.i("SMSReceiver","Phone-----");
       TelephonyManager teleManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
       
       switch(teleManager.getCallState())
       {
       case TelephonyManager.CALL_STATE_RINGING:
        Toast.makeText(context, "Ring"+intent.getStringExtra("incoming_number"),Toast.LENGTH_SHORT).show();
        break;
       case TelephonyManager.CALL_STATE_OFFHOOK:
        Toast.makeText(context, "OFFHOOK"+intent.getStringExtra("incoming_number"),Toast.LENGTH_SHORT).show();
        break;

       case TelephonyManager.CALL_STATE_IDLE:
        Toast.makeText(context, "IDLE"+intent.getStringExtra("incoming_number"),Toast.LENGTH_SHORT).show();
        break;
       }
      }
      else if( intent.getAction().equals("WHATFUCK"))
      {
       String str = intent.getStringExtra("DDD");//
       
       Toast.makeText(context, "And What The Fuck" + str,Toast.LENGTH_SHORT).show();
      }
     }
    }

      下面是主动发送一个broadcast的动作,并附带了一些信息

         Intent intent = new Intent("WHATFUCK");
         intent.putExtra("DDD", "FFF");
            
         sendBroadcast(intent);

       2.需要对要接受的“动作”进行注册。方法有
                1> 在AndroidManifest.xml文件中进行静态注册
                     <receiver android:name=".SMSReceiver"> 
                  <intent-filter> 
                        <action android:name="android.provider.Telephony.SMS_RECEIVED" />  这个是收到短信的action
                               <action android:name="android.intent.action.PHONE_STATE"/> 这个是电话状态改变的action
               <action android:name="WHATFUCK"/>  这个是自己定义的action
                  </intent-filter>
          </receiver>
     
                   电话跟短信还需要添加权限
          <uses-permission android:name="android.permission.RECEIVE_SMS"/>
          <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
                 2.动态注册
                   注册     reciver = new SMSReciver();
                 IntentFilter filter = new IntentFilter("WHATFUCK");
                 registerReceiver(reciver,filter);
                   取消     unregisterReceiver(reciver);
                   一般的话  注册会在 activity的 onStart里面,而取消注册会在onStop里面,所以他的生命期就依附于Activity的生命了。
     
      
  • 相关阅读:
    Drools只执行一个规则或者执行完当前规则之后不再执行其他规则(转)
    使用redis作为缓存,数据还需要存入数据库中吗?(转)
    双亲委派
    SpringBoot整合Mybatis传参的几种方式
    Drool规则引擎详解(转)
    IDEA导出可执行的jar包
    十:SpringBoot-配置AOP切面编程,解决日志记录业务
    九:SpringBoot-整合Mybatis框架,集成分页助手插件
    七:SpringBoot-集成Redis数据库,实现缓存管理
    八:SpringBoot-集成JPA持久层框架,简化数据库操作
  • 原文地址:https://www.cnblogs.com/rollrock/p/2364893.html
Copyright © 2011-2022 走看看