安卓中的广播事件分为两种,一种是系统的广播;一种是自定义的广播。


系统的广播:


手机在收到短信,接到电话,系统都会向所有应用发送广播,如果程序中声明了获取短信等先关权限就能获取这些广播,从而获取自己想要的相关信息,如短信内容等。


自定义的广播:


可以在程序中发送广播,目前我了解的只能是本程序来接收这些广播。




下面说下接收广播的方式。要想接收广播,需要先注册广播接收器,一种静态的,一种动态的。


静态的需要在AndriodManifest.xml中的application标签下加入如下代码:


<!--短信广播接收者  -->
   <receiver android:name="com.ldkj_bank.www.util.SmsReciver" >
            <intent-filter android:priority="999">
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
   </receiver>

这段代码的意思是SmsReciver这个类可以接收短信的广播。当然,这个类必须继承自BroadcastReceiver

动态的需要创建专门的广播接收类,此类继承于BroadcastReceiver

//=========================广播接收器==========================================================
    private class MyBroadcastRecv extends BroadcastReceiver{

		@Override
		public void onReceive(Context context, Intent intent) {
			Bundle bundle = intent.getExtras();
			SmsMessage msg = null;
			if (null != bundle) {
				Object[] smsObj = (Object[]) bundle.get("pdus");
				for (Object object : smsObj) {
					msg = SmsMessage.createFromPdu((byte[]) object);
	    		Date date = new Date(msg.getTimestampMillis());//时间
	                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	                String receiveTime = format.format(date);
					System.out.println("number:" + msg.getOriginatingAddress()
					+ "   body:" + msg.getDisplayMessageBody() + "  time:"
							+ msg.getTimestampMillis());
					
					//在这里写自己的逻辑
					if (msg.getOriginatingAddress().equals("1069020510184195")) {
			            //这里我是要获取自己短信服务号码中的验证码~~  
			            Pattern pattern = Pattern.compile("[0-9]{6}");  
			            Matcher matcher = pattern.matcher(msg.getDisplayMessageBody());  
			            if (matcher.find()) {  
			                String res = matcher.group().substring(0, 6);  
			                final EditText numberText = (EditText) numberDialog.findViewById(R.id.pay_pwd);
			                numberText.setText(res);  
			            }  
						
					}
					
				}
			}
			
		}
    	
    	
    }

广播接收器设置好了,就要告诉它需要接收什么类型的广播了,就是绑定接收广播的类型.可以参考下边的函数:

//注册广播接收器
	private void regBroadcastReceiver(){
		broadcastRecv = new MyBroadcastRecv();
		IntentFilter filter = new IntentFilter();
		filter.addAction("android.provider.Telephony.SMS_RECEIVED");
;
		registerReceiver(broadcastRecv, filter);
	}

这段程序的意思就是broadcastRecv可以接收短信的广播。



接收系统的广播还要在AndriodManifest.xml文件中声明的权限。例如上边所说的获取短信的权限。要加入如下代码:

<!--获取读取短信的权限  -->
     <uses-permission android:name="android.permission.RECEIVE_SMS" >
    </uses-permission>
    <uses-permission android:name="android.permission.READ_SMS" >
    </uses-permission>


以上所说的均为获取系统的广播,那么如果我在程序中,想要自己想要发送一个广播,然后让其他的程序接收怎么办呢?

下边是截取的发送广播的一段代码:

//发送用户更新广播
	private void sendPersonHasChangedBroadcast(){
		Intent intent = new Intent();
		intent.setAction(Constant.personHasChangedAction);
		sendBroadcast(intent);
	}

Constant,personHasChangeAction是一个自定义字符串,便于接收端接收区分是什么广播,这样就发出去了。接收还和上边的接收方式类似。通过广播接收器类的onReceive方法接收。intent.getAction()获取字符串来区分,类如如下代码:

//广播接收器处理类
	private class ServiceBroadcastReceiver extends BroadcastReceiver{
		@Override
		public void onReceive(Context context, Intent intent) {
			if(intent.getAction().equals(Constant.WIFIACTION) || intent.getAction().equals(Constant.ETHACTION)){
				new CheckNetConnectivity().start();
			}else if(intent.getAction().equals(Constant.updateMyInformationAction)){
				getMyInfomation();
				comBridge.joinOrganization();
			}else if(intent.getAction().equals(Constant.refuseReceiveFileAction)){
				comBridge.refuseReceiveFile();
			}else if(intent.getAction().equals(Constant.imAliveNow)){
				
			}
		}
	}



那么什么时候用自定义广播合适呢?

一般是用于这个程序有service类在界面下来接收、处理请求,或者做其他的事情。需要刷新界面的时候。就发送广播。如果service收到一个消息,需要在界面中显示出来,就用到了。