Android背景线程不断收听UDP端口



我非常感谢您花几分钟来阅读我的问题,谢谢!

我正在为某些特定用户构建一个非公共应用程序,这是我的问题:


我有一个用于背景工作负载的服务,其中我启动了一个不断听到UDP端口的用户线程。当设备屏幕打开时,它可以正常工作,但是关闭屏幕时丢失了所有UDP数据包。

以下是我在主题中写的:

// Android os v7.1.2, wifi 
DatagramSocket s;
DatagramPacket p;  // already initialized 
while (true) {
    try {
        if (s == null || !s.isBound()) {
            s = new DatagramSocket(60000);
            s.setSoTimeout(0);
        } else {
            s.receive(p);  
            ... 
        }
    } catch(Exception e) {
        ...
    }
}

我猜这是Android设备上与电源管理有关的问题。我尝试过place powermanager.wakelock.aquire() and reparess() while wily loop之前和之后,但确实会生效。

要清楚,此应用程序是为特定客户端构建的,并且不在乎它将耗尽多少电池(可能是设备上唯一的运行应用程序,大声笑)。

知道我该怎么办?我是否应该选择 IntentService 或类似的东西来实现此"无限" UPD端口听力工作?我花了整个周末在Android文档中寻求解决方案,但没有例子说我可以立即触发UDP插座的聆听[Sad Face]。

有关更多信息,我在我的服务中启动了所有三个套接字连接线程,并发现使用TCP套接字将STH发送到服务器并等待STH发送回发送的一个线程正常工作...

我们开发了一个具有可比要求的SIP应用程序。

有一个重要的设置,您的用户必须使用他们的设备,您无法在应用程序中执行此操作。

他们需要转到设置 ->数据 ->背景数据,然后打开"无限背景数据"。另外,他们应该将该应用程序"未进行优化"以优化电池,因此,如果Android不断排出电池,Android不会杀死它/让它入睡。这些是设置,一个应用程序根本无法做到。它必须由用户完成。

另外,您很正确,仅适用于CPU的Wakelock(即没有TURN_SCREEN_ON标志)是您要走的方式。

,但是您应该避免让Wakelock打开"永远",因为Android可能会杀死它。

我会做这样的事情:

    1. aquire a wakelock" 1",超时30秒
    1. 25秒后,Aquire A Wakelock" 2",让" 1"用完了。
    1. 再过30秒后,Aquire" 1"再次让" 2"超时。
    1. 返回步骤2。

这是一个背景线程将在第一次Wakelock times之前重新审议另一个Wakelock。

我希望你能得到这个主意。

最新更新