Buen día, me encuentro desarrollando una aplicación donde utilizo un servicio para monitorizar constantemente la posición de mis usuarios, inicialmente el servicio trabajaba bien excepto en teléfonos que tenían el ahorro de energía activado, ya que cuando el usuario bloqueaba el teléfono la aplicación se reiniciaba cuando volvía a entrar, según la documentación esto es normal.
Luego de investigar un buen rato encontré la opción de iniciar el servicio como ForegroundService, esto ya lo tengo implementado y efectivamente el servicio no se cae ni la aplicación se cierra excepto cuando se inicia desde el icono de la pantalla principal, al clickear sobre él se inicia una instancia de la pantalla principal pero el servicio continua transmitiendo, solo se reinicia toda la interfaz, ¿Como puedo evitar que se reinicie la interfaz?, cuando inicio la aplicación desde la pila de aplicaciones todo funciona perfecto, aquí dejo el código del servicio, de antemano muchas gracias
@Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent.getAction().equals(Constants.ACTION.STARTFOREGROUND_ACTION)) { Log.i(TAG, "Received Start Foreground Intent "); Intent notificationIntent = new Intent(this, MainConductor.class); notificationIntent.setAction(Constants.ACTION.MAIN_ACTION); /* notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);*/ notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); Intent previousIntent = new Intent(this, ServicioEnvioPosicion.class); previousIntent.setAction(Constants.ACTION.PREV_ACTION); PendingIntent ppreviousIntent = PendingIntent.getService(this, 0, previousIntent, 0); Intent playIntent = new Intent(this, ServicioEnvioPosicion.class); playIntent.setAction(Constants.ACTION.PLAY_ACTION); PendingIntent pplayIntent = PendingIntent.getService(this, 0, playIntent, 0); Intent nextIntent = new Intent(this, ServicioEnvioPosicion.class); nextIntent.setAction(Constants.ACTION.NEXT_ACTION); PendingIntent pnextIntent = PendingIntent.getService(this, 0, nextIntent, 0); Bitmap icon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_taxi_libre_gps); Notification notification = new NotificationCompat.Builder(this) .setPriority(Notification.PRIORITY_MAX) .setVibrate(new long[] { 1000 }) .setLights(Color.YELLOW, 3000, 3000) .setContentTitle("Esperando solicitudes...") .setTicker("Taxi - GP") //.setContentText("TAXI-GP") .setSmallIcon(R.drawable.rueda) .setLargeIcon( Bitmap.createScaledBitmap(icon, 128, 128, false)) //.setContentIntent(pendingIntent) .setOngoing(true).build(); /*.addAction(R.drawable.ic_rueda_black, "Fuera de servicio", ppreviousIntent).build(); .addAction(android.R.drawable.ic_media_play, "Play", pplayIntent) .addAction(android.R.drawable.ic_media_next, "Next", pnextIntent).build();*/ startForeground(Constants.NOTIFICATION_ID.FOREGROUND_SERVICE, notification); } else if (intent.getAction().equals(Constants.ACTION.PREV_ACTION)) { Log.i(TAG, "Clicked Previous"); // stopSelf(); //startActivity(new Intent(ServicioEnvioPosicion.this, MainConductor.class)); } else if (intent.getAction().equals(Constants.ACTION.PLAY_ACTION)) { Log.i(TAG, "Clicked Play"); } else if (intent.getAction().equals(Constants.ACTION.NEXT_ACTION)) { Log.i(TAG, "Clicked Next"); } else if (intent.getAction().equals( Constants.ACTION.STOPFOREGROUND_ACTION)) { Log.i(TAG, "Received Stop Foreground Intent"); stopForeground(true); stopSelf(); } //------------------------------------------***************************---------------- Log.d(TAG, "Servicio iniciado..."); servicioEnEjecucion = true; locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); /*Se ejecuta cada vez que hay un cambio en la posicion del usuario*/ milListener = new LocationListener() { @Override public void onLocationChanged(Location location) { location.getLatitude(); location.getLongitude(); /*Guardamos nuestra posicion y actualizamos la posicion en la main activity*/ posicionConductor = new LatLng(location.getLatitude(), location.getLongitude()); MainConductor.posicionConductor = new LatLng(location.getLatitude(), location.getLongitude()); } /*Se ejecuta cada vez que hay un cambio en la configuracion del gps*/ @Override public void onStatusChanged(String provider, int status, Bundle extras) { switch (status) { case LocationProvider.AVAILABLE: Log.d("debug", "LocationProvider.AVAILABLE"); break; case LocationProvider.OUT_OF_SERVICE: Log.d("debug", "LocationProvider.OUT_OF_SERVICE"); break; case LocationProvider.TEMPORARILY_UNAVAILABLE: Log.d("debug", "LocationProvider.TEMPORARILY_UNAVAILABLE"); break; } } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } }; if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { /*Aqui se deberian solicitar permisos pero como ya se solicitan desde el principio * ya no es necesario*/ } else { /*se configura para transmitir cada 10 segundos la posicion*/ locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 7000, 0, (LocationListener) milListener); locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 0, (LocationListener) milListener); } /*-------------------------------------------------------------------------- ---------------------------------------------------*/ final ConfirmacionRegistrosSimples listenerEnvioRecibido = new ConfirmacionRegistrosSimples() { @Override public void abstractMtdRegistroResultado(String resultado) { /*el telefono no suena hasta que efectivamente se notificque que se recibio en la base de datos * en ese instante le deben quedar 4 intentos de busqueda obligatoriamente a la aplicacion usuario*/ if(resultado.equals("1")) { /*Intent de inicio de pantalla de servicio*/ Intent dialogIntent = new Intent(ServicioEnvioPosicion.this, PantallaServicio.class); dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(dialogIntent); //stopSelf(); } else { carreraEncontrada = false; } } }; /*-------------------------------------------------------------------------- ------------------------------------------------------*/ /*Aqui llega el resultado de la consulta de servicio cada 10 segundos*/ final InterfaseServicio listenerServicio = new InterfaseServicio() { @Override public void AbsMtdDatosServicio(DatosServicio datosServicio) { hiloEnEjecucion=false;//autorizamos que se ejcute un nuevo hilo solo hasta terminar de ejecutar el primero if(datosServicio.getCoordenadas()!=null)// sí hay un servicio { /*Igualamos los datos recibidos del servicio a los datod estaticos de servicio*/ dataServicio = datosServicio; idServicio = datosServicio.getIdServicio(); /*Avisamos que ya hay carrera para evitar que siga pregutando por carreras*/ carreraEncontrada=true; RegistroAsincronoSimple objRegistro2 = new RegistroAsincronoSimple(ServicioEnvioPosicion.this, listenerEnvioRecibido); objRegistro2.execute("http://taxigp.com.co/Servicios/NotificacionServicioRecibido.php?id="+datosConductor.getIdConductor()+"&recibido=true"); } } }; Timer timer = new Timer(); timerTask = new TimerTask() { @Override public void run() { Log.i(TAG,"transmite"); /*Estas lineas de codigo actualizan la posicion del conductor cada 24 segundos em el mapa frecuenciaActualizacionPosicionMapa ++; if(frecuenciaActualizacionPosicionMapa==1) { frecuenciaActualizacionPosicionMapa=0; }*/ sendResult("16 segundos"); try { /*Actualizacion de posicion*/ String URL = "http://taxigp.com.co/Servicios/ActualizarPosicionServicio.php?idServicio="+idServicio+"" + "&nuevaposicion=" + posicionConductor.latitude + "," + posicionConductor.longitude + "&idtax=" + datosConductor.getIdConductor() + ""; ClaseRegistrar objRegistro = new ClaseRegistrar(); String rechazado = objRegistro.mtdRegistrar(URL, ServicioEnvioPosicion.this); if(rechazado.equals("1")&&!servicioCancelado) { servicioCancelado = true; /*Intent de inicio de pantalla de servicio*/ Intent dialogIntent = new Intent(ServicioEnvioPosicion.this, CancelacionServicio.class); dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(dialogIntent); } /*verificador de servicio*/ if (!hiloEnEjecucion && !carreraEncontrada) { objVerificador = new VerificacionSolicitudServicio(ServicioEnvioPosicion.this, listenerServicio, Integer.parseInt(datosConductor.getIdConductor())); objVerificador.execute(); hiloEnEjecucion = true; } }catch (Exception e) { Log.e("hola",e.getMessage()); } } }; timer.scheduleAtFixedRate(timerTask, 0, 8000);//Hace un ciclo cada 10 segundos return START_STICKY; }