簡體   English   中英

Android服務-SocketIO-GCM-與活動進行通信

[英]Android Service - SocketIO - GCM - Communicate with Activity

希望這個問題不會太廣泛或要求太多...

我正在為我的辦公室構建一個Android應用程序。 該應用程序用於向所有使用該應用程序的用戶發送消息警報(作為自定義的“消息”對象類)(僅限我的辦公室)。 收到郵件后,所有收件人的姓名都會在底部列出,並帶有狀態圖標,顯示他們對郵件的回復(基本上是向上或向下的拇指)。

我有一台Node / Express服務器,該服務器用於跟蹤,存儲和分發消息並記錄其歷史記錄。 當用戶發送警報消息時,它將轉到將處理分發的節點服務器。

應用程序要求

  1. 適用於應急人員。 該應用程序必須始終能夠接收警報。 如果他們沒有服務,沒關系,一條SMS將作為備份發送。 但是所有Android手機都必須始終在監聽我的Node服務器進行更新。
  2. 該應用程序必須在啟動時啟動,或者至少在啟動一項服務或啟動服務器后才能啟動。 這基於最后一個要求,即它必須始終在偵聽服務器。
  3. 收到消息后,用戶將在特定活動中查看它。 此活動列出了所有收件人及其狀態(向上或向下豎起大拇指)。 該屏幕將始終需要連接到網絡套接字,並在其他用戶提交其狀態時實時更新狀態。

這是我的問題

我看到了推薦的幾種方法,但我不知道該使用哪種方法。

  1. 創建一個后台服務(服務或intentservice ...不知道嗎?),該服務將在啟動時啟動並連接到Node服務器。

    這引起了一些問題:

    一種。 可以在電話24/7上建立這樣的TCP套接字連接嗎?

    b。 一天只交換幾次數據。 打開的連接會殺死電池嗎?

    C。 如果服務從服務器接收到消息,是否可以使用此“始終運行”服務來啟動我的應用程序活動? 另外,我可以輕松地將消息從后台服務發送到應用程序嗎? (我不太清楚線程。...這對我來說是很難的部分)。

  2. 使用GCM來“觸發”手機以啟動該應用程序,一旦啟動該應用程序,請使用主UI線程創建與服務器的連接並拉下已發送的消息。

    一種。 我從未使用過GCM,只是昨天才了解到它。 這是用來做什么的嗎?

    b。 如果我使用GCM,是否需要創建一個始終在啟動時啟動的“始終運行”后台服務? 還是GCM有一些始終聽的方式?

我並不完全理解如何使用線程,我的Java知識還不到平均水平(不過我不會說初學者),這是我有史以來第一個Android應用程序。 該應用程序看起來很漂亮,而且真的很不錯,但是我只是不知道該如何處理始終連接的網絡。

這是一張有助於理解我需要的圖紙: 需要數據流

感謝您的答復,並抽出時間閱讀問題的龐然大物。

一種。 可以在電話24/7上建立這樣的TCP套接字連接嗎?
b。 一天只交換幾次數據。 打開的連接會殺死電池嗎?

持久服務器連接具有許多挑戰。 您絕對需要每隔幾分鍾發送一次保持活動的數據包,否則,懶惰的路由器會假設您的連接已死,並在實際需要它們時丟棄數據包(這是google本身的問題)。 是的,這肯定會耗盡電池,因為它需要一直聽。 也就是說,如果您設法使連接完全保持打開狀態,因為Android具有省電功能,這些功能僅禁用了后台應用程序的聯網功能。

C。 如果服務從服務器接收到消息,是否可以使用此“始終運行”服務來啟動我的應用程序活動? 另外,我可以輕松地將消息從后台服務發送到應用程序嗎? (我不太清楚線程。...這對我來說是很難的部分)。

是的你可以。 同樣, 從服務中啟動活動也很容易,您可以在Intent傳遞諸如消息之類的數據。 Wrt線程,后台服務實際上不在線程中運行,而是在主ui線程中運行。 您可以在其中啟動線程。 在聯網的情況下,您甚至必須這樣做,因為該服務否則會阻塞UI線程。 該應用程序的活動也使用相同且唯一的ui線程。


一種。 我從未使用過GCM,只是昨天才了解到它。 這是用來做什么的嗎?

這正是它的目的。 它還可以為您解決以上所有挑戰。

b。 如果我使用GCM,是否仍需要創建一個始終在啟動時啟動的“始終運行”后台服務? 還是GCM有一些始終聽的方式?

否。您定義了一個<receiver> / BroadcastReceiver ,即使該應用程序未運行,它也會被觸發。 系統的GCM服務(您需要安裝的Google Play服務應用的一部分)會為您完成所有等待消息。 從那里您可以開始活動/服務,或者(可能是最好的辦法)顯示一條通知,當您單擊該應用程序時會打開它。 從后台事件無處不在地開展活動是非常破壞性的。 您甚至可以將消息本身放到GCM有效負載中(如果它不太大),這樣就可以潛在地保存1個Web請求並加快初始顯示速度。


GCM通常在快速傳遞消息方面做得很好,但是您可以從http://support.whispersystems.org/hc/en-us/articles/213190487-Why-is-there-a-delay-in-receiving中看到-messages-https://threema.ch/zh-CN/faq/push_andr,在某些情況下會導致延遲。 除非您有非常特殊的要求並且不關心電池,否則不要像1)中那樣實現自己的電池-使用GCM。

順便說一句,沒有辦法知道手機是否收到了內置在GCM中的GCM消息。 因此,當設備未連接到服務器時,您可以在超時后發送備用SMS)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM