Android andriod服务线程在几分钟后停止工作(运行?)

Android andriod服务线程在几分钟后停止工作(运行?),android,Android,我有一个前台服务,带有一个监视UDP数据包的线程。它工作得很好,直到我把手机单独放5分钟左右(但不完全是5分钟),然后它停止发送从UDP数据包得到的更新。这是100%可复制的,我可以通过数据包捕获在网络上看到UDP数据包,所以我知道它们在那里 private class ArduinoUDPListener extends Thread { private MulticastSocket socket; private AtomicBoolean done; pr

我有一个前台服务,带有一个监视UDP数据包的线程。它工作得很好,直到我把手机单独放5分钟左右(但不完全是5分钟),然后它停止发送从UDP数据包得到的更新。这是100%可复制的,我可以通过数据包捕获在网络上看到UDP数据包,所以我知道它们在那里

    private class ArduinoUDPListener extends Thread {
    private MulticastSocket socket;
    private AtomicBoolean done;
    private Instant lastMsgTime;

    public void run() {

        PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
        PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                "MyApp::MyWakelockTag");
        wakeLock.acquire();


        WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
        WifiManager.MulticastLock multicastLock = null;
        multicastLock = wm.createMulticastLock("udp for hamwin");
        multicastLock.acquire();
        WifiManager.WifiLock wifiLock = null;
        wifiLock = wm.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, "wifi lock for ham");
        wifiLock.acquire();

        lastMsgTime = Instant.MIN;

        done = new AtomicBoolean(false);
        try {
            socket = new MulticastSocket(7234);
            InetAddress group = InetAddress.getByName("239.1.1.234");
            socket.joinGroup(group);
            socket.setReuseAddress(true);
            socket.setBroadcast(true);
            if (!socket.getBroadcast()) {
                socket.close();
                return;
            }
            socket.setSoTimeout(100);
            byte[] buf = new byte[65535];
            DatagramPacket p = new DatagramPacket(buf, 65535);
            while (!done.get()) {
                try {
                    socket.receive(p);
                } catch (SocketTimeoutException e) {
                    // retry
                    continue;
                } catch (IOException e) {
                    e.printStackTrace();
                    break;
                }


                // Process packet,
                //    sometimes we just stop getting here after a few minutes of normal activity if the phone is not touched.

                if (mainThreadHdlr != null) {
                    Message msg = mainThreadHdlr.obtainMessage();
                    msg.obj = update;
                    mainThreadHdlr.sendMessage(msg);
                    Log.i("Net", "Sent update");
                } else {
                    System.out.println("null?");
                }
            }
        }
        socket.close();
    }
我还应该带其他的唤醒锁吗?我还能做些什么来保持网络/线程的活力吗?我甚至不知道它是以什么方式停止的。网络?中央处理器?其他的

更新
在添加一些更详细的日志记录之后,我发现SocketTimeoutException总是定期抛出,但当屏幕关闭时,UDP数据包发送到应用程序的频率会降低!我希望每秒都有一个数据包,有时当屏幕关闭时,数据包在约5-10秒或更长时间内不会到达。

是否关闭应用程序?请参阅以下问题:我不会关闭应用程序,因为屏幕关闭时会终止您的服务。不建议使用wake_lock,因为这是一个负面权限。是否关闭应用程序?请参阅以下问题:我不关闭应用程序,因为它会在屏幕关闭时终止您的服务。而且不建议使用wake_lock,因为这是一个负面许可。