2017-10-16 203 views
0

我的android應用程序啓動一個服務,該服務打開一個websocket以與遠程服務器進行通信。該服務產生一個線程,其運行方法如下所示。Websocket在Android應用程序轉到後臺時暫停

public void run() { 
     try { 
      super.run(); 

      for(int i = 1; i < 1000; i++) { 
       Log.d(TAG, String.format(" *** Iteration #%d.", i)); 
       Thread.sleep(3000); // Dummy load. 
       mWebsocket.sendTextMessage("Test"); 
      } 
     } 
     catch (Exception exc) { 
      Log.d(MY_TAG, "MyThread.run - Exception: " + exc.getMessage()); 
     } 
    } 

當我關閉屏幕或發送該應用的背景下,logcat的示出了循環運行,但遠程服務器停止接收測試消息。顯然,這些消息正在彙集到某處,因爲一旦應用程序返回到前臺,服務器將收到一堆測試消息。這是Android上的預期行爲嗎?我嘗試了不同的Websocket包(Autobahn,okhttp3,...),結果是一樣的。

回答

1

如果您希望此功能在您的應用的用戶界面位於後臺時保證繼續運行,您需要將該服務作爲前臺服務運行。有關使用前臺服務的一些限制/指導原則,請參閱文檔https://developer.android.com/guide/components/services.html。或者,如果這是需要定期循環發生並且不需要連續運行的工作,則可以使用JobScheduler;見https://developer.android.com/topic/performance/scheduling.html

+0

我只是想知道爲什麼循環仍在運行並輸出到logcat,但消息不會去任何地方。這種行爲是否特定於一般websocket?到這兩個websocket包? –

+0

即使服務在自己的線程中運行,它看起來像所有的網絡活動,而不僅僅是當主應用程序轉到後臺時停止websocket。我想在這種情況下使用網絡,前臺服務必須使用。 –

+0

是的,我真的認爲你會更好的前景服務。這也將避免Android操作系統將殺死您的後臺服務以回收其他應用資源或節省電量的時間。 –

相關問題