Lo que yo sugeriría es anular los métodos onPause/onReume como han dicho otros. Sin saber más sobre el flujo de su aplicación y las interacciones entre Actividades, no puedo brindar mucha más información más allá de las conjeturas.
Si sus actividades son persistentes, sin embargo, mi recomendación sería utilizar las Intents mejor cuando cambie de Actividades.
Por ejemplo, cada actividad debe tener un indicador booleano de "transición". Por lo tanto, cuando se pasa de una actividad a otra, se configura un extra de Intención:
intent.putExtra("transition",true);
utilizada en la actividad que reciba por: (en onCreate)
intent.getBooleanExtra("transition",false);
De esta manera, para cada actividad que se inicia, puede saber si proviene de otra actividad o si se inició desde un iniciador de pantalla de inicio. Por lo tanto, si obtiene una transición verdadera, entonces onPause NO debe detener el servicio, lo que significa que volverá a la actividad anterior después de que regrese. Si no recibe ninguna extra de "transición", o una transición falsa, entonces puede asumir con seguridad que no hay ninguna Actividad debajo esperando a tomar el relevo por la actual.
En la primera actividad, simplemente tendrá que detener el servicio si está cambiando a otra actividad, que podrá descubrir mediante programación si una actividad se inicia desde otra.
Cuando dices "tu aplicación no está en primer plano", ¿te refieres a una actividad que es diferente de tu servicio (aunque estoy seguro de que forma parte de la misma)? – Brandon
Dentro del ciclo interminable del servicio, agregue un cheque para ver si su aplicación está en primer plano. Pero le costará el permiso 'GET_TASKS' en el manifiesto. –