我正在创建一个需要不断向服务器发送UDP数据包的Android应用程序。
问题是2-5分钟后,屏幕关闭后,服务停止发送数据,直到我重新打开屏幕(也可以在服务器端确认)。
这是服务启动命令:
startService(new Intent(getBaseContext(), Service.class));
onStartCommand:
@Override
public int onStartCommand(Intent intent, int flags, int startId){
Toast.makeText(this, "Armed!", Toast.LENGTH_LONG).show();
(new Thread(new App())).start();
return START_REDELIVER_INTENT;
}
运行方法,来自App线程:
public void run(){
Vibrator alarm = (Vibrator) MainActivity.getAppContext().getSystemService(Context.VIBRATOR_SERVICE);
String IP = getWiFiIP(MainActivity.getAppContext());
while(true){
while (IP.equals(wifiAddr)){ //Confirm presence on local network, with host
//Unlocked door
System.out.println("Started locally!");
sendData(KEY, hostAddrLocal);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
IP = getWiFiIP(MainActivity.getAppContext());
}
}
}
我很肯定我没有内存耗尽,我没有其他应用程序,使用Lollipop 5.0在Galaxy S4上运行
是因为我正在与主要活动进行交互,以获取上下文
MainActivity.getAppContext()
?
我尝试了很多东西,包括STICKY_SERVICE
。
答案 0 :(得分:3)
问题是2-5分钟后,屏幕关闭后,服务停止发送数据,直到我重新打开屏幕(也可以在服务器端确认)。
CPU很可能与WiFi无线电一样断电。您需要获取WakeLock
和WifiLock
以保持两者都已启动。对于使用普通硬件的普通用户,由于电池耗尽,保持CPU和WiFi无线电一直处于非常不受欢迎。
答案 1 :(得分:2)
Android被编程为在不活动后入睡。当发生这种情况时,它会关闭处理器并且不允许任何应用程序处理。要成为此规则的例外,您需要持有部分唤醒锁。这样做会导致您使用更多的电池,所以尽量不要超过需要的时间。