2015-09-10 2 views
-2

Мне нужно поддерживать поток, который позволяет мне отправлять данные, даже если приложение находится в фоновом режиме или убито (пользователь задвигает приложение или закрывает его).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? Почему я должен изменить, есть ли способ использовать уведомление с Сервисом?

ответ

1

Здесь нет причин использовать IntentService. IntentService ставит в очередь команды запуска, которые он получает (от вызовов до startService()) и выполняет их поочередно по фоновому потоку, а затем останавливается, когда очередь истощается. Это не то поведение, которое вы хотите, поэтому не используйте его.

Чтобы воспользоваться услугой с уведомлением, используйте метод startForeground() и предоставьте объект уведомления, который будет показан. Я бы не рекомендовал этого, кроме того, что должно быть видимым для пользователя, например, службы воспроизведения музыки (с элементами управления воспроизведением в уведомлении).