Мне нужно поддерживать поток, который позволяет мне отправлять данные, даже если приложение находится в фоновом режиме или убито (пользователь задвигает приложение или закрывает его).Android keep alive IntentService
Я знаю, что смогу воспользоваться Сервисом или IntentService. Кто-то сказал мне, что с IntentService я могу использовать уведомление, то, что я делаю, это нечто вроде приложения, такого как Telegram или Whatsapp, который постоянно прослушивает новые сообщения.
Я использовал Service и это мой результат:
package test.com.connectionservices.Services;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPListenerService extends Service {
static String UDP_BROADCAST = "UDPBroadcast";
DatagramSocket socket;
private void listenAndWaitAndThrowIntent() throws Exception {
try {
DatagramSocket clientSocket = null;
clientSocket = new DatagramSocket();
String data ;
byte[] sendData ;
InetAddress IPAddress = InetAddress.getByName("AN IP");
int i = 0;
while (true) {
data = "TEST THE SERVICE"+i;
sendData = data.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 21);
clientSocket.send(sendPacket);
i++;
}
} catch (Exception e) {
}
}
private void broadcastIntent(String senderIP, String message) {
Intent intent = new Intent(UDPListenerService.UDP_BROADCAST);
intent.putExtra("sender", senderIP);
intent.putExtra("message", message);
sendBroadcast(intent);
}
Thread UDPBroadcastThread;
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();
}
private Boolean shouldRestartSocketListen = true;
void stopListen() {
shouldRestartSocketListen = false;
socket.close();
}
@Override
public void onCreate() {
}
@Override
public void onDestroy() {
stopListen();
}
@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;
}
}
Это прекрасно работает, если я пойду в другое приложение или я убить приложение с помощью Android (сдвинув ее в Lollipop) будет процесс в фоновом режиме, который затопляет ресивера.
Как я могу изменить его с помощью IntentService? Почему я должен изменить, есть ли способ использовать уведомление с Сервисом?