Android学习笔记之广播(2)

fmms 13年前
     <p>BroadCastReceiver用于监听被广播的事件(Itent)</p>    <p>为了达到这个目的,我们就必须进行BroadCastReceiver注册,注册共两种方法:</p>    <p><1>在应用程序代码中进行注册</p>    <p>这种注册方法比较灵活,我们想什么时候注册就什么时候注册,什么时候关闭就什么时候关闭。</p>    <p>注册BroadCastReceiver:</p>    <p>registerReeiver(receiver,filter)</p>    <p>取消BroadCastReceiver:</p>    <p>unregisterReeiver(receiver)</p>    <p>如果一个BroadCastReciver用于更新UI,通常会使用这种方法进行注册,Activity启动时就注册BroadCastReciver,Activity不可见时就取消注册。</p>    <p>步骤:1 生成一个BroadCastReceiver对象</p>    <p>           2 生成一个Intentfilter对象</p>    <p>           3 为Intentfilter对象添加一个Action</p>    <pre class="brush:java; toolbar: true; auto-links: false;">class RegisterReceiverListener implements OnClickListener{    public void onClick(View v) {    //生成一个BroiadcastReceiver对象    smsReceiver = new SMSReceiver();    //生成一个IntentFilter对象    IntentFilter filter = new IntentFilter();    //为IntentFilter添加一个Action    filter.addAction(SMS_ACTION);    //将BroadcastReceiver对象注册到系统当中    TestBC2Activity.this.registerReceiver(smsReceiver, filter);   }           }          class UnRegisterReceiverListener implements OnClickListener{    public void onClick(View v) {    //解除BroadcastReceiver对象的注册    TestBC2Activity.this.unregisterReceiver(smsReceiver);   }           }</pre>    <span><span>SMSReceiver.java  <pre class="brush:java; toolbar: true; auto-links: false;">package mars.testbc2;  import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.telephony.SmsMessage;  public class SMSReceiver extends BroadcastReceiver{   @Override  public void onReceive(Context context, Intent intent) {   // TODO Auto-generated method stub   System.out.println("receive message");      //接受Intent对象当中的数据   Bundle bundle = intent.getExtras();   //在Bundle对象当中有一个属性名为pdus,这个属性的值是一个Object数组   Object[] myOBJpdus = (Object[]) bundle.get("pdus");    //创建一个SmsMessage类型的数组         SmsMessage[] messages = new SmsMessage[myOBJpdus.length];           System.out.println(messages.length);         for (int i = 0; i<myOBJpdus.length; i++)          {             //使用Object数组当中的对象创建SmsMessage对象           messages[i] = SmsMessage.createFromPdu((byte[]) myOBJpdus[i]);             //调用SmsMessage对象的getDisppalyMessageBody()方法,就可以得到消息的内容           System.out.println(messages[i].getDisplayMessageBody());         }         try {    Thread.sleep(30 * 1000);    System.out.println("-------------------------------");   } catch (InterruptedException e) {    // TODO Auto-generated catch block    e.printStackTrace();   }  }  }</pre></span></span><2>在AndroidManifest.xml当中进行注册    <pre class="brush:xml; toolbar: true; auto-links: false;"><receiver android:name=".TestReceiver">    <intent-filter>     <action android:name="android.intent.action.EDIT" />    </intent-filter>   </receiver></pre>    <p></p>    <p>用这种方法注册的有如下一种特点:</p>    <p>用这种方法注册的应用程序的及时关闭了,BroadCastReceiver依然会接收到广播出的一个对象,也就是说无论应用程序关与开,都处于一种活动状态中,都接受到广播事件。<br /> 有的应用程序就需要这种特点。</p>    <p>例如,开发一种应用程序,来检测手机的耗电量。</p>    <p>我们不能总要求应用程序打开,我们希望应用程序及时关闭了,也能照样检测手机的耗电量。</p>    <p>但是,我们如果开发的应用程序来更新手机控件,采用这种方式就不太合适了。只有我们看到Activity,我们更新控件采用意义。</p>    <p>如果没看到Activity还照样更新,除了耗电,消耗内存外,一点好处也没有。所以就需要第一种方法。</p>    <p></p>