1、推送工具使用html
咱們在作安卓開發的時候,一般須要一些消息推送功能,我我的平時用的是極光推送,極光推送(JPush)是一個端到端的推送服務,使得服務器端消息可以及時地推送到終端用戶手機上,讓開發者積極地保持與用戶的鏈接,從而提升用戶活躍度、提升應用的留存率。極光推送客戶端支持 Android, iOS 兩個平臺。java
使用的時候咱們能夠先去官網看開發文檔,我是在個人新聞客戶端中引用了這個sdk,下載解壓以後能夠按照步驟作相應操做就能夠了,我的感受仍是挺實用的。android
本身按照源碼從新作了一個簡單的可接收消息的demo,編程
下面給出的是PushReceiver的代碼:json
public class PushReceiver extends BroadcastReceiver { private static final String TAG = "PushReceiver"; @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); Log.d(TAG, "onReceive - " + intent.getAction()); if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) { } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent .getAction())) { System.out.println("收到了自定義消息。消息內容是:" + bundle.getString(JPushInterface.EXTRA_MESSAGE)); // 自定義消息不會展現在通知欄,徹底要開發者寫代碼去處理 } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent .getAction())) { System.out.println("收到了通知"); // 在這裏能夠作些統計,或者作些其餘工做 } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent .getAction())) { System.out.println("用戶點擊打開了通知"); // 在這裏能夠本身寫代碼去定義用戶點擊後的行爲 String extra = bundle.getString(JPushInterface.EXTRA_EXTRA); System.out.println("附加信息:" + extra); try { JSONObject jo = new JSONObject(extra); String url = jo.getString("url"); System.out.println("url:" + url); // 跳瀏覽器加載網頁 } catch (JSONException e) { e.printStackTrace(); } } } }固然,這段代碼用了一個自定義消息的功能,能夠推送json數據,不僅是推送標題消息哦!全部須要客戶端被動接收信息的功能模塊,均可以用推送實現
而後用JSONObject jo = new JSONObject(extra);
String url = jo.getString("url");來解析,固然咱們還能夠用Gson來解析json數據。瀏覽器
2、推送原理簡介服務器
-xmpp 是一種基於TCP/IP的協議, 這種協議更適合消息發送。七層協議。網絡
事實上Google官方的C2DM服務器底層也是採用XMPP協議進行的封裝。XMPP(可擴展通信和表示協議)是基於可擴展標記語言(XML)的協議,它用於即時消息(IM)以及在線探測。這個協議可能最終容許因特網用戶向因特網上的其餘任何人發送即時消息。關於XMPP協議我在上篇博文中已經介紹,你們能夠參考下文章:http://www.cnblogs.com/hanyonglu/archive/2012/03/04/2378956.html
- socket 套接字, 發送和接收網絡請求。這個我在大三的時候上網絡編程的時候學過,可是當時沒有用心學額。socket
咱們知道兩個進程若是須要進行通信最基本的一個前提能可以惟一的標示一個進程,在本地進程通信中咱們可使用PID來惟一標示一個進程,但PID只在本地惟一,網絡中的兩個進程PID衝突概率很大,這時候咱們須要另闢它徑了,咱們知道IP層的ip地址能夠惟一標示主機,而TCP層協議和端口號能夠惟一標示主機的一個進程,這樣咱們能夠利用ip地址+協議+端口號惟一標示網絡中的一個進程。
可以惟一標示網絡中的進程後,它們就能夠利用socket進行通訊了,什麼是socket呢?咱們常常把socket翻譯爲套接字,socket是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層複雜的操做抽象爲幾個簡單的接口供應用層調用已實現進程在網絡中通訊。
ide
- 長鏈接 keep-alive, 服務器基於長鏈接找到設備,發送消息 -心跳包 , 客戶端會定時(30秒一次)向服務器發送一段極短的數據,做爲心跳包, 服務器定時收到心跳,證實客戶端活着,纔會發消息.不然將消息保存起來,等客戶端活了以後(從新鏈接),從新發送.