我非常感谢您花几分钟来阅读我的问题,谢谢!
我正在为某些特定用户构建一个非公共应用程序,这是我的问题:
我有一个用于背景工作负载的服务,其中我启动了一个不断听到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可能会杀死它。
我会做这样的事情:
-
- aquire a wakelock" 1",超时30秒
-
- 25秒后,Aquire A Wakelock" 2",让" 1"用完了。
-
- 再过30秒后,Aquire" 1"再次让" 2"超时。
-
- 返回步骤2。
这是一个背景线程将在第一次Wakelock times之前重新审议另一个Wakelock。
我希望你能得到这个主意。