天天看點

從安卓擷取短信内容為例 淺談安卓的廣播的使用

安卓中的廣播事件分為兩種,一種是系統的廣播;一種是自定義的廣播。

系統的廣播:

手機在收到短信,接到電話,系統都會向所有應用發送廣播,如果程式中聲明了擷取短信等先關權限就能擷取這些廣播,進而擷取自己想要的相關資訊,如短信内容等。

自定義的廣播:

可以在程式中發送廣播,目前我了解的隻能是本程式來接收這些廣播。

下面說下接收廣播的方式。要想接收廣播,需要先注冊廣播接收器,一種靜态的,一種動态的。

靜态的需要在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收到一個消息,需要在界面中顯示出來,就用到了。