博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android push (一):SMS push
阅读量:5093 次
发布时间:2019-06-13

本文共 2148 字,大约阅读时间需要 7 分钟。

移动终端为了节省电量和网络流量,不再采用轮训服务器的方式来收集数据,而是在服务器有数据需要发送到终端时通知终端。我们称这种机制叫推送(push)。终端接收到通知消息,如果客户端应用正则运行,则连接服务器接收数据,即使客户端程序不在运行状态,也可以启动客户端程序去接收说句,或者以一定的方式通知用户服务器有数据变化。

短信(SMS)Push 和 Ip push是比较常见的两种push方式。

本篇主要简单说说Sms push。

 

Sms push的原理:

sms push是通过发送二进制短信到移动终端,来达到通知终端的目的。客户端拦截这类短信,分析短信PDU的数据,然后采取相应的操作。push短信是通过Wap push来承载的。其内容包括头部和数据两部分,头部中应该含有目的端口和原端口号(可类比IP报文)。

由于发送短信需要运营商的支持,比如移动的邮件推送网关(GEGW:GPRS Email Gateway),依赖性比较强。

Android客户端拦截短信处理:

客户端静态注册一个广播接收器,即使应用不在运行,广播接收器也能拦截短信。

这样当push短信下发时(监听到端口16001的数据),系统发起Intent激活广播接收器,广播接受器在其事件回调函数中进行处理

@Override public void onReceive(Context context, Intent intent) {
String action = intent.getAction(); if (TextUtils.equals(action, "android.intent.action.DATA_SMS_RECEIVED")) {
handleDataSmsReceived(context, intent); } }

在处理函数handleDataSmsReceived中,获取pdu数据并解析,了解服务器的数据发生何种变化,客户端可以进行相应处理。

简易实现代码如下:

private void handleDataSmsReceived(Context context, Intent intent) {
Uri uri = intent.getData(); int port = uri.getPort();//接受端口 16001 SmsMessage[] msgs = getMessagesFromIntent(intent); String senderNumber = msgs[0].getOriginatingAddress();//短信发送方的电话号码
int type =  parse(msgs)//解析 pdu的业务部分数据,根据与服务器交互的协议去解         switch(type){
//不同的情况分类处理 } }

获取的短信的方法

private static final SmsMessage[] getMessagesFromIntent(Intent intent) {
Object[] messages = (Object[]) intent.getSerializableExtra("pdus"); byte[][] pduObjs = new byte[messages.length][]; for (int i = 0; i < messages.length; i++) {
pduObjs[i] = (byte[]) messages[i]; } byte[][] pdus = new byte[pduObjs.length][]; int pduCount = pdus.length; SmsMessage[] msgs = new SmsMessage[pduCount]; for (int i = 0; i < pduCount; i++) {
pdus[i] = pduObjs[i]; msgs[i] = SmsMessage.createFromPdu(pdus[i]); } return msgs; }

Pdu的格式本文不作讨论,网上可以找到相关资料,android源码类SmsMessage也有代码实现。

总结:

android短信push的关键在于拦截短信,一旦拦截到了短信,可以利用android自带的特性去完成后续操作,比如可以Push notification,可以Toast,可以发起连接服务器的请求,客户端应用不在线时,可以发一个Intent启动该应用然后再进行处理。

转载于:https://www.cnblogs.com/devxiaobai/archive/2011/12/15/smspush.html

你可能感兴趣的文章
ubuntu(linux)占领小米平板2(mipad2)
查看>>
【java】自定义异常类
查看>>
【Oracle】Oracle基本数据类型总结
查看>>
第四周学习进度条3
查看>>
Rsync的配置与使用
查看>>
程序员应注意——米勒法则
查看>>
深刻理解Python中的元类(metaclass)
查看>>
[转]java String的经典问题(new String(), String)
查看>>
.net Core使用RabbitMQ
查看>>
博客园博客转至个人网站博客声明
查看>>
linux安装Linux下软件的安装与卸载方法
查看>>
nginx模块
查看>>
牛客网 牛客小白月赛2 H.武-最短路(Dijkstra)
查看>>
Memo组件
查看>>
多普达D700手机利用USB电缆与电脑连接上网方法
查看>>
C语言循环的嵌套
查看>>
Unity3D研究院之手游开发中所有特殊的文件夹(转)
查看>>
bitmap格式分析(转)
查看>>
Mysql密码加密方式
查看>>
一探前端开发中的JS调试技巧
查看>>