Android push (一):SMS push 移动终端为了节省电量和网络流量,再也不采用轮训服务器的方式来收集数据,而是在服务器有数据须要发送到终端时通知终端。咱们称这种机制叫推送(push)。终端接收到通知消息,若是客户端应用正则运行,则链接服务器接收数据,即便客户端程序不在运行状态,也能够启动客户端程序去接收说句,或者以必定的方式通知用户服务器有数据变化。 短信(SMS)Push 和 Ip push是比较常见的两种push方式。 本篇主要简单说说Sms push。 Sms push的原理: sms push是经过发送二进制短信到移动终端,来达到通知终端的目的。客户端拦截这类短信,分析短信PDU的数据,而后采起相应的操做。push短信是经过Wap push来承载的。其内容包括头部和数据两部分,头部中应该含有目的端口和原端口号(可类比IP报文)。 因为发送短信须要运营商的支持,好比移动的邮件推送网关(GEGW:GPRS Email Gateway),依赖性比较强。 Android客户端拦截短信处理: 客户端静态注册一个广播接收器,即便应用不在运行,广播接收器也能拦截短信。 <receiver android:name=".service.receiver.MyBroadcastReceiver"> <intent-filter android:priority="1000"> <action android:name="android.intent.action.DATA_SMS_RECEIVED" /> <data android:scheme="sms" android:host="localhost" android:port="16001" /> </intent-filter> 这样当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启动该应用而后再进行处理。