Android Умирает сервис после закрытия основного приложения
Я изпользую pusher.com (https://github.com/pusher/pusher-websocket-java).
Проблема следующая я создал сервис и прописал там код пушера для получения пушев в фоновом режиме, но как только я закрываю основное приложение (MainActivity) сервис умирает.
В поисках проблемы я попробывал запустить обычный цикл for в новом потоке в сервисе и о чуда при закрытии основного приложения цикл также умирал. Я думаю pusher по дефолту создает соедининие в новом потоке. Тогда я после кода подключения пушера создал бессконечный цикл while и при закрытии основного приложения сервис и пушер продолжил работать! Но как это сделать "по нормальному" без бесконечного цикла?
На api 24 все работает и без циклов, возможно система просто прибивает сервис, но почему...
Код:
//MainActivity
startService(new Intent(this, MyService.class));
//MyService
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
PusherOptions options = new PusherOptions();
options.setCluster("eu");
Pusher pusher = new Pusher("apikey", options);
pusher.connect(new ConnectionEventListener() {
@Override
public void onConnectionStateChange(ConnectionStateChange change) {
Log.i("Pusher", "State changed from " + change.getPreviousState() +
" to " + change.getCurrentState());
}
@Override
public void onError(String message, String code, Exception e) {
Log.i("Pusher", "There was a problem connecting! " +
"\ncode: " + code +
"\nmessage: " + message +
"\nException: " + e
);
}
}, ConnectionState.ALL);
Channel channel = pusher.subscribe("my-channel");
channel.bind("my-event", new SubscriptionEventListener() {
@Override
public void onEvent(PusherEvent event) {
Log.i("Pusher", "Received event with data: " + event.toString());
}
});
/* Тот самый while с которым все работает
while (true) {
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
*/
return START_STICKY;
}
Ответы (1 шт):
Intent serviceIntent = new Intent(getApplicationContext(), MusicServ.class);
ContextCompat.startForegroundService(getApplicationContext(), serviceIntent);
Надо использовать startForegroundService. Если просто смены методики старта не помогает, изучите полный гайд как сделать ForegroundService
https://androidwave.com/foreground-service-android-example/