Android push (一):SMS push

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啓動該應用而後再進行處理。
相關文章
相關標籤/搜索