2017-01-24 61 views
5

我有一個Android應用程序,它具有聊天客戶端作爲其功能之一。聊天客戶端使用基於Android的Smack庫的XMPP,並在後臺運行Openfire作爲XMPP服務器。使用BOSH建立連接整個XMPP連接處理是作爲服務實現的,即使應用程序的活動不在前臺,也可以在後臺運行並偵聽傳入消息。到目前爲止,一切都很好。Android/Smack:讓XMPP連接在睡眠模式下保持活動狀態

唯一的問題似乎是睡眠模式。在模擬器中(當設置爲「保持喚醒」狀態)或使用電話時,XMPP連接處於暫停狀態,應用程序可以發送和接收消息。但是,一旦手機進入睡眠模式,XMPP連接將中斷 - 我可以在Openfire服務器的管理控制檯中看到用戶處於脫機狀態。直觀地說,我想一直接收消息,例如WhatsApp。

當然,我在網上搜索包括Stackoverflow,但我無法得到明確的答案。通常情況下,用例似乎是必須定期執行一項任務,例如每小時執行一次。但是,在聊天客戶端的情況下,這似乎並不起作用。因爲我認爲這是一個常見的情況 - 畢竟,有沒有那麼多的聊天應用或使用聊天功能在那裏 - 這是我的問題:

  • 我如何必須改變/延長應用程序,我可以在手機正在睡覺時收到聊天消息?我發現了WakeLock。這是要走的路還是這些不適合我的使用情況?

  • 由於棒棒糖,還有JobScheduler API本身使用WakeLock。好點?

  • 例如,WhatsApp如何處理這種情況?

在旁註:我有使用模擬器調試睡眠模式的問題。當我在模擬器中關閉「保持喚醒」狀態時,屏幕在1分鐘後變黑並且XMPP連接斷開。但我不知道如何喚醒/切換模擬器,一旦它變黑。 Android Studio實際上告訴我某些時候設備或其他東西已經消失,我必須重新啓動模擬器。

回答

2

解決此問題的確切方法是使用推送通知。

XMPP連接的自然行爲是在指定的空閒間隔後斷開連接,即設備進入休眠狀態。

即將到來的WhatsApp的情況下,它也使用相同的XMPP並維護一個服務器,充當交換消息的包裝類。該服務器檢查消息狀態是否已交付。 如果未收到郵件,它會在收到郵件時發送推送通知,現在位於推送服務的設備端,它會檢查連接是否處於活動狀態並進行身份驗證。

如果未通過身份驗證,它將重新建立連接。通過這種方式,大多數聊天應用程序管理此超時異常。

希望這有助於:)

+0

您不需要推送通知,也不是「XMPP連接在指定空閒間隔後斷開連接的自然行爲」。 – Flow

2

你不需要推送通知,你不需要WakeLock秒。而不是簡單地

  • 白名單您的應用程序從打盹模式
  • 使用粘性(START_STICKY)後臺服務
  • 使用啪的ServerPingWithAlarmManager
  • CONNECTIVY_CHANGED意圖法案由Android發送,並使用XMPPTCPConnection「中,且s instantShutdown()案件。
+0

它是如何影響電池壽命的。如果我理解正確,將來自打盹模式的應用列入白名單需要手機用戶確定。 – Christian

+0

對電池壽命的影響取決於有多少XMPP節點通過電線。因此你應該避免不必要的流量。 – Flow

+0

@流逝最後一個話題的目標是什麼?謝謝 – joao2fast4u

相關問題