2017-10-16 410 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操作系统将杀死您的后台服务以回收其他应用资源或节省电量的时间。 –

相关问题