Android学习之广播机制(2)

BroadCastReceiver用于监听被广播的事件(Itent)

为了达到这个目的,我们就必须进行BroadCastReceiver注册,注册共两种方法:

<1>在应用程序代码中进行注册

这种注册方法比较灵活,我们想什么时候注册就什么时候注册,什么时候关闭就什么时候关闭。

注册BroadCastReceiver:

registerReeiver(receiver,filter)

取消BroadCastReceiver:

unregisterReeiver(receiver)

如果一个BroadCastReciver用于更新UI,通常会使用这种方法进行注册,Activity启动时就注册BroadCastReciver,Activity不可见时就取消注册。

步骤:1 生成一个BroadCastReceiver对象

           2 生成一个Intentfilter对象

           3 为Intentfilter对象添加一个Action

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);
		}
    	
    }


SMSReceiver.java  

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();
		}
	}

}

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

<receiver android:name=".TestReceiver">
			<intent-filter>
				<action android:name="android.intent.action.EDIT" />
			</intent-filter>
		</receiver>

用这种方法注册的有如下一种特点:

用这种方法注册的应用程序的及时关闭了,BroadCastReceiver依然会接收到广播出的一个对象,也就是说无论应用程序关与开,都处于一种活动状态中,都接受到广播事件。
有的应用程序就需要这种特点。

例如,开发一种应用程序,来检测手机的耗电量。

我们不能总要求应用程序打开,我们希望应用程序及时关闭了,也能照样检测手机的耗电量。

但是,我们如果开发的应用程序来更新手机控件,采用这种方式就不太合适了。只有我们看到Activity,我们更新控件采用意义。

如果没看到Activity还照样更新,除了耗电,消耗内存外,一点好处也没有。所以就需要第一种方法。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值