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的生命了。
 
  

你可能感兴趣的:(android BroadcastReceiver 例子)