Android push:SMS push

移动开发 Android
sms push是通过发送二进制短信到移动终端,来达到通知终端的目的。客户端拦截这类短信,分析短信PDU的数据,然后采取相应的操作。push短信是通过 Wap push来承载的。

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

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

本篇主要简单说说Sms push。

Sms push的原理:

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

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

Android客户端拦截短信处理:

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

  1. <receiver android:name=".service.receiver.MyBroadcastReceiver"
  2.            <intent-filter android:priority="1000"
  3.                <action android:name="android.intent.action.DATA_SMS_RECEIVED" /> 
  4.                <data android:scheme="sms" android:host="localhost" android:port="16001" /> 
  5.            </intent-filter>  

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

 

  1. @Override 
  2.     public void onReceive(Context context, Intent intent) { 
  3.         String action = intent.getAction(); 
  4.         if (TextUtils.equals(action, "android.intent.action.DATA_SMS_RECEIVED")) { 
  5.             handleDataSmsReceived(context, intent); 
  6.         } 
  7. }  

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

简易实现代码如下:

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

获取的短信的方法

  1. private static final SmsMessage[] getMessagesFromIntent(Intent intent) { 
  2.         Object[] messages = (Object[]) intent.getSerializableExtra("pdus"); 
  3.         byte[][] pduObjs = new byte[messages.length][]; 
  4.         for (int i = 0; i < messages.length; i++) { 
  5.             pduObjs[i] = (byte[]) messages[i]; 
  6.         } 
  7.         byte[][] pdus = new byte[pduObjs.length][]; 
  8.         int pduCount = pdus.length; 
  9.         SmsMessage[] msgs = new SmsMessage[pduCount]; 
  10.         for (int i = 0; i < pduCount; i++) { 
  11.             pdus[i] = pduObjs[i]; 
  12.             msgs[i] = SmsMessage.createFromPdu(pdus[i]); 
  13.         } 
  14.         return msgs; 
  15.     }  

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

总结:

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

责任编辑:闫佳明 来源: oschina
相关推荐

2012-12-21 14:05:39

AndroidPush开源方案解析

2013-07-04 09:58:46

Android Pus信息推送

2011-07-25 18:07:29

iPhone Push Notificati

2023-08-02 08:05:54

push系统迭代APP

2013-06-24 15:32:41

JPush极光推送Android Pus移动开发

2011-04-22 10:23:50

Server Push

2021-09-02 09:51:32

监控系统分布式

2009-03-13 13:46:41

.NETServer push服务端

2010-07-26 14:30:29

Perl Push

2011-04-22 10:36:09

Server Push推送技术

2011-07-18 13:56:19

2018-03-20 12:30:44

iOSPush抓包

2011-06-03 17:29:09

TapLynxPush.IO移动应用

2011-07-25 16:47:01

HTTP Server PUSH

2011-07-06 14:22:52

iPhone Push

2011-07-07 08:49:14

iPhone Push Notificati

2021-07-02 22:23:50

Nacos配置模型

2011-07-06 16:55:56

iPhone php Push

2022-08-09 08:18:19

RocketMQpush消费

2017-04-24 08:31:26

Node.jsExpress.jsHTTP
点赞
收藏

51CTO技术栈公众号