У меня есть 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();
}
}
использование WakeLock & IntentService –
@SyedNazarMuhammad Как я могу использовать WakeLock и почему IntentService? Я размещаю еще один вопрос об Service или IntenetService, и они ответили мне, чтобы использовать сервис, см. Мой вопрос – user4789408
https://developer.android.com/reference/android/support/v4/content/WakefulBroadcastReceiver.html –