采用广播接收者查看短信

一、广播接收者

使用BroadcastReceiver来实现广播接收者查看短信

原理:当系统收到短信时,会发出一个action 名称为:android.provider.Telephony.SMS_RECEIVED的Intent,使用名称"pdus"可以从Intent中获取到系统接收到的短信内容。


二、广播接收者的两种注册方式:

           1、在AndroidManifest.xml文件中通过receiver标签静态注册,例子:

	<receiver android:name=".SmsBroadcastReceiver"> 
	        <intent-filter android:priority="1000"> 
	                <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
	        </intent-filter> 
	</receiver>


2、 通过 Context.registerReceiver() 动态注册,如:

public class MainActivity extends Activity {

	private final static String ACTION_SEND = "android.provider.Telephony.SMS_RECEIVED";
	private SmsBroadcastReceiver receiver;
	@Override
	protected void onResume() {
		registerReceiver(receiver, new IntentFilter(ACTION_SEND));
	}

	@Override
	protected void onPause() {
		unregisterReceiver(receiver);
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		setContentView(R.layout.activity_main);
		receiver = new SmsBroadcastReceiver();
	}


}


注册完成后, 当发送者发送某个广播时系统会将发送的广播(Intent)与系统中所有注册的符合条件的接收者(Receiver) 的IntentFilter进行匹配,若匹配成功则执行相应接收者的onReceive函数。


三、关于registerReceiver动态注册和通过receiver标签静态注册广播的区别如下:

1.对bindService的调用,receiver注册的广播,在onReceive结束后广播即不存在,所以不能在其中给自己异步传递结果,如bindService而只能使用startService,如果想跟service交互可使用peekService。

2. 手动控制。registerReceiver为动态注册,自己可以手动注册或是取消注册;receiver标签为静态注册,由系统开机时自动扫描注册,所以无法手动控制,开机一直运行中。

3. 资源消耗不同。registerReceiver可以手动控制,所以适当的注册和取消注册能节省系统资源,receiver标签系统开机后一直有效。

4. 有效期不同。通过registerReceiver注册的BroadcastReceiver在对其进行注册的Context对象"销毁"了或者调用了unregisterReceiver方法时也就失效了,而通过receiver标签注册的BroadcastReceiver只要应用程序没有被删除就一直有效。

5. 对registerReceiver函数的调用许可不同。通过registerReceiver注册的BroadcastReceiver在其onReceive函数中可以再次调用某个Context的registerReceiver函数,而通过receiver标签注册的BroadcastReceiver不允许再调用某个Context的registerReceiver函数 。

6. 使用情况不同。对于自己发送和接受的广播可以通过registerReceiver注册,对于系统常用广播的接收通常用receiver标签注册。


四、广播接收者 实现代码:

public class SmsBroadcastReceiver extends BroadcastReceiver {
	private final static String Tag = "SmsBroadcastReceiver";
	
	@Override
	public void onReceive(Context context, Intent intent) {
		Log.i(Tag, "onReceive");
		//pdus表示短信意图
		Object[] pdus = (Object[])intent.getExtras().get("pdus");
		for(Object p : pdus){
			byte[] pdu = (byte[]) p;
			SmsMessage message = SmsMessage.createFromPdu(pdu);
			//短信内容
			String content = message.getMessageBody();
			Date date = new Date(message.getTimestampMillis());
			SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			String receiveTime = format.format(date);
			//短信发送地址
			String senderNumber = message.getOriginatingAddress();
			sendSms(content,receiveTime,senderNumber);
			//onReceive在10秒内没有执行完毕,android会认为程序没有相应,所以不要使用子线程,以免被中断
			//new Thread(new sendSms(content,receiveTime,senderNumber)).start();
			
		}
	}
	
	private boolean sendSms(String content, String receiveTime, String senderNumber){
		//web服务地址
		String path = "http://192.168.23.51:8080/SmsListener/SmsReceive";
		try {
			String params = "content="+URLEncoder.encode(content,"UTF-8")
					+"&receiveTime="+receiveTime+"&senderNumber="+senderNumber;
			byte[] entity = params.getBytes();
			HttpURLConnection conn = (HttpURLConnection)new URL(path).openConnection();
			conn.setConnectTimeout(5000);
			conn.setRequestMethod("POST");
			conn.setDoOutput(true);
			conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
			conn.setRequestProperty("Content-length", String.valueOf(entity.length));
			conn.getOutputStream().write(entity);
			
			if(conn.getResponseCode()==200){
				Log.i(Tag, "receive sms success");
				return true;
			}
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Log.i(Tag, e.getMessage());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Log.i(Tag, e.getMessage());
		}
		Log.i(Tag, "receive sms failure");
		return false;
	}
}

web服务端代码如下:

/**
 * Servlet implementation class SmsReceive
 */
public class SmsReceive extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String content = request.getParameter("content");
		String receiveTime = request.getParameter("receiveTime");
		String senderNumber = request.getParameter("senderNumber");
		
		System.out.println("content:"+content);
		System.out.println("receiveTime:"+receiveTime);
		System.out.println("senderNumber:"+senderNumber);
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值