2015-09-10 2 views
2

У меня есть UDP клиент/сервер работает в фоновом режиме с службой, это мои операции:Android Сервис работает в фоновом режиме потери данных

  • я запустить приложение
  • Служба начинается
  • Я закрыть приложение, но служба работает в фоновом режиме (это то, что я хочу)
  • я отправить сообщение ПДП, и телефон правильно принимает и ответить мне
  • Я не отправлять сообщения в течение приблизительно 5 минут
  • Я посылаю сообщение, мой телефон не отвечает мне
  • Я пытаюсь отправить еще одно сообщение еще раз, мой телефон прямо сейчас ответить

Как это могло произойти? Мое приложение кажется спать и просыпаться, когда я отправляю первое сообщение, но он может отвечать только на второй или иногда мне нужно 4-5 сообщений, прежде чем получить ответ, может быть, это латентность или другое?

Если я наводняю свое приложение, он всегда ответит мне правильно, но если я не буду отправлять сообщения в течение некоторого времени, это вызовет проблему.

Я хочу, чтобы мое приложение отвечало мне каждый раз, даже если приложение закрыто или телефон заблокирован.

Это мой код:

public class UDPListenerService extends Service { 

    DatagramSocket socket; 
    private Boolean shouldRestartSocketListen = true; 
    Thread UDPBroadcastThread; 

    private void listenAndWaitAndThrowIntent() throws Exception { 
     try { 
      byte[] receiveData = new byte[1024]; 
      byte[] sendData = new byte[1024]; 
      DatagramSocket serverSocket = new DatagramSocket(9876); 

       while (true) { 

        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
        serverSocket.receive(receivePacket); 
        String sentence = new String(receivePacket.getData()); 
        System.out.println("RECEIVED: " + sentence); 
        InetAddress IPAddress = receivePacket.getAddress(); 
        int port = receivePacket.getPort(); 
        String capitalizedSentence = sentence.toUpperCase(); 
        sendData = capitalizedSentence.getBytes(); 
        DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); 
        serverSocket.send(sendPacket); 
        receiveData = new byte[1024]; 

      } 

     } catch (Exception e) { 

     } 
    }  

    void startListenForUDPBroadcast() { 
     UDPBroadcastThread = new Thread(new Runnable() { 
      public void run() { 
       try { 
        while (shouldRestartSocketListen) { 
         listenAndWaitAndThrowIntent(); 
        } 
        //if (!shouldListenForUDPBroadcast) throw new ThreadDeath(); 
       } catch (Exception e) { 
        Log.i("UDP", "no longer listening for UDP broadcasts cause of error " + e.getMessage()); 
       } 
      } 
     }); 
     UDPBroadcastThread.start(); 
    }  

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     shouldRestartSocketListen = true; 
     startListenForUDPBroadcast(); 
     Log.i("UDP", "Service started"); 
     return START_STICKY; 
    } 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 

    } 
    @Override 
    public void onDestroy() { 
     stopListen(); 
    } 
    void stopListen() { 
     shouldRestartSocketListen = false; 
     socket.close(); 
    } 
} 
+0

использование WakeLock & IntentService –

+0

@SyedNazarMuhammad Как я могу использовать WakeLock и почему IntentService? Я размещаю еще один вопрос об Service или IntenetService, и они ответили мне, чтобы использовать сервис, см. Мой вопрос – user4789408

+0

https://developer.android.com/reference/android/support/v4/content/WakefulBroadcastReceiver.html –

ответ

0

Причина ваше приложение останавливается, потому что услуга усыпила систему. Возможно, вам нужно использовать метод bindService() в вызывающей активности.

Проверить https://developer.android.com/guide/components/services.html для получения дополнительной информации о методах и жизненных циклах услуг.

Смежные вопросы