安卓中的廣播事件分為兩種,一種是系統的廣播;一種是自定義的廣播。
系統的廣播:
手機在收到短信,接到電話,系統都會向所有應用發送廣播,如果程式中聲明了擷取短信等先關權限就能擷取這些廣播,進而擷取自己想要的相關資訊,如短信内容等。
自定義的廣播:
可以在程式中發送廣播,目前我了解的隻能是本程式來接收這些廣播。
下面說下接收廣播的方式。要想接收廣播,需要先注冊廣播接收器,一種靜态的,一種動态的。
靜态的需要在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收到一個消息,需要在界面中顯示出來,就用到了。