編輯:Android開發教程
消息推送,顧名思義,是由一方主動發起,而另一方與發起方以某一種方式建立連接並接收消息。在Android開發中,這裡的發起方我們把它叫做推送服務器(Push Server),接收方叫做客戶端(Client)。相比通過輪詢來獲取新消息或通知,推送無論是在對客戶端的資源消耗還是設備耗電量來說都比輪詢要好,所以,目前絕大多數需要及時消息推送的App都采用Push的方式來進行消息通知。
Android生態系統原本提供了類似於Apple iOS推送服務APNS的GCM(Google Cloud Messaging for Android),以前叫C2DM,但是由於某些原因,導致這項服務在國內不是很好使,為了彌補這個不足,並且我朝各大同胞又想使用Android推送服務,所以國內各大平台陸續推出了GCM的替代品,今天要介紹的就是其中一家,由百度提供的雲推送。另外,國內做消息推送服務的還有極光推送和個推等,他們的客戶包括新浪微博、淘寶等國內一線大公司。
推送的實現技術簡單來說就是利用Socket維持Client和Server間的一個TCP長連接,通過這種方式能大大降低由輪詢方式帶來的Device的耗電量和數據訪問流量。目前,百度雲推送提供的推送服務支持的單一消息體大小是4k,如果超過4k,則建議在消息內攜帶服務請求URL進行二次請求。目前,百度雲推送針對Android端提供通知推送,文本消息推送以及富媒體推送。
Push Server向指定的設備(Device)或是用戶(User)推送消息,一個用戶對應一個userID,一個User可能擁有多台Device,我們希望向同一個userID推送消息時,他所有綁定了userID的Device都能收到消息。百度雲推送給出的解決方案是通過Client向Push Server注冊,並在Client端的監聽端口取得Push Server返回的 channelID和userID,channelID指定一個終端,在向Push Server注冊的過程中,Device可以發送IMIE碼或者UUID作為唯一標示,在Push Server注冊後再返回給Client生成的channelID和userID。這兩個ID獲取到後由開發者自行維護,注冊完畢後,Push Server維護一個注冊設備列表,這個列表維護了userID和channelID以及與Device對應的關系,當需要向指定的設備或用戶推送消息時,Push Server會首先遍歷這個設備列表,通過這兩個ID來做唯一性判斷並找到需要推送消息的Device,然後就可以進行消息推送了。
實例:用戶A發表問題時,記錄問題id及其對應的A的userID(或channelID),用戶B發表問題回答時,通過服務端API向問題id對應的userID(或channelID)指向的Device推送答案。
百度雲推送通過對Client設置標簽(Tag)的方式來進行用戶分組,Tag的產生方式可以是由Client維護也可以由Server收集,Push Server針對不同的Tag進行推送過濾,最終將消息推送到指定的Client。無論是由Client主動設置的Tag還是由Server根據用戶使用習慣收集的,都由Push Server進行統一管理,在基於Tag的分組消息推送實現上,Push Server首先根據指定Tag從所有Tag下遍歷出的對應的已注冊的Device,從而可以獲得與Device對應的userID和channelID,繼而可以針對指定Tag進行分組消息推送。對比單播消息推送,分組消息推送在推送周期上勢必要長一些,並且在待推消息列表的維護上也需要做一些處理,哪些消息是推送成功的,哪些是失敗的,這需要接收消息推送的Client在接收到消息後給Push Server一個消息回執,這樣就保證了消息送達的准確性,如果消息推送失敗,則分組列表裡的待推消息會繼續推送,直到推送消息成功。另外,在消息推送的實時性上,分組消息推送對比單播消息推送會根據分組消息隊列的先後存在一個消息接收的延時,好比現在微信公眾賬號的推送,就是一個分組消息推送的實例,在消息接收的時效性上對比單播推送存在一定的延時性。
另外,還有一類消息推送使用場景,就是廣播消息,該類型可以理解為分組消息的一個特列,即向所有的Tag對應的Client推送消息。廣播消息是對全體集合的一個消息推送,在消息隊列維護和消息推送時效性上比單個或幾個Tag的分組推送成本要高。
實例:給應用提供喜好設置頁面,用戶勾選不同的類別,觸發對應Tag的設置,這種方式是由Client主動維護Tag。或者用戶閱讀了某個類別的圖書,觸發對應Tag的設置,在服務端,給指定類別的圖書設置Tag,後續會根據服務端收集的Tag給應用推送該Tag下的新書信息,這種方式就是由服務端來維護Tag分組。
查看本欄目更多精彩內容:http://www.bianceng.cn/OS/extra/
TableLayout可以把視圖views組織成“行”或“列”。可以使用<TableRow>元素指定表格中的一
這段時間在學Android應用開發,在想既然是用Java開發的應該很好反編譯從而得到源代碼吧,google了一下,確實很簡單, 以下是我的實踐過程。在此鄭重聲明,貼出來的
博主在大學裡學的專業就是軟件開發與游戲設計,所以對於游戲這個行業一直都有著濃厚的興趣,卻因為 陰差陽錯,又或許是緣分不夠吧。一直都沒有真正的進入到這個行業裡來,但對於游戲
ActivityInstrumentationTestCase2 主要用來測試一個或多個Activity的功能測試,使用和最終應用同樣的運行環境來測試 Activity的