Android服务在不到5分钟后停止

时间:2015-03-20 21:38:04

标签: java android multithreading service

我正在创建一个需要不断向服务器发送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

2 个答案:

答案 0 :(得分:3)

  

问题是2-5分钟后,屏幕关闭后,服务停止发送数据,直到我重新打开屏幕(也可以在服务器端确认)。

CPU很可能与WiFi无线电一样断电。您需要获取WakeLockWifiLock以保持两者都已启动。对于使用普通硬件的普通用户,由于电池耗尽,保持CPU和WiFi无线电一直处于非常不受欢迎。

答案 1 :(得分:2)

Android被编程为在不活动后入睡。当发生这种情况时,它会关闭处理器并且不允许任何应用程序处理。要成为此规则的例外,您需要持有部分唤醒锁。这样做会导致您使用更多的电池,所以尽量不要超过需要的时间。