В документации для IntentService
говорится:
... служба запускается по мере необходимости, обрабатывает каждое намерение по очереди, используя рабочий поток, и останавливается, когдау него заканчивается работа.
Итак, я полагаю, проблема в том, что ваша служба не работает после завершения onHandleIntent()
.Следовательно, сервис останавливается и уведомление прекращается.Итак, концепция IntentService, вероятно, не лучший вариант для вашей задачи.
Поскольку вопрос называется «StartForeground for IntentService», я хотел бы уточнить некоторые моменты:
Это действительнопросто заставить IntentService работать на переднем плане (см. код ниже), но вам необходимо учесть несколько вещей:
Не запускать службу на переднем плане, если это занимает несколько секундтолько - это может вызвать ошибку у ваших пользователей.Представьте, что вы периодически запускаете короткие задачи - это приведет к появлению и исчезновению уведомлений - ухххх *
Возможно, вам понадобится сделать ваш сервис способным поддерживать бодрствование устройства (но это другая историяочень хорошо описан в работе над переполнением стека) *
Если вы поставили в очередь несколько Intents для своей службы IntentService, то приведенный ниже код будет отображать / скрывать уведомление.(Таким образом, для вашего случая может быть лучшее решение - так как @CommonsWare предлагает расширить Service и делать все самостоятельно, однако хотелось бы отметить - в Javadoc нет ничего, что IntentService говорит, что он работает всего несколько секунд - он работает до тех пор, покаэто должно что-то делать.)
public class ForegroundService extends IntentService {
private static final String TAG = "FrgrndSrv";
public ForegroundService() {
super(TAG);
}
@Override
protected void onHandleIntent(Intent intent) {
Notification.Builder builder = new Notification.Builder(getBaseContext())
.setSmallIcon(R.drawable.ic_foreground_service)
.setTicker("Your Ticker") // use something from something from R.string
.setContentTitle("Your content title") // use something from something from
.setContentText("Your content text") // use something from something from
.setProgress(0, 0, true); // display indeterminate progress
startForeground(1, builder.build());
try {
doIntesiveWork();
} finally {
stopForeground(true);
}
}
protected void doIntesiveWork() {
// Below should be your logic that takes lots of time
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}