El proceso del servicio se cancela después de que la aplicación se elimina de la bandeja de aplicaciones

Estoy iniciando un servicio (o reiniciar el servicio en ejecución) cuando se inicia una actividad, usando:

Intent intent = new Intent(this, MyService.class); startService(intent);

Posteriormente, basándose en ciertas acciones, la misma actividad se vincula al servicio utilizando

 bindService(new Intent(this, MyService.class), mConnection, Context.BIND_AUTO_CREATE); 

Y cuando la actividad es destruida, llamo

 unbindService(mConnection); 

Anteriormente, el servicio se utilizaba para reiniciar cuando mataba la misma actividad / aplicación desde la bandeja de aplicaciones y mostraba el "mensaje 1 proceso 1 de servicio en ejecución" en las aplicaciones en ejecución.

Ahora, el servicio no se reinicia al matar la misma actividad / aplicación.

Y recibo el mensaje "0 process 1 service running" , lo que significa que el servicio en realidad no se está ejecutando.

El servicio no se reinicia cuando se cierra la aplicación. Mi aplicación consiste en una actividad. También el servicio se inicia correctamente cuando se inicia después de un arranque del sistema.

¿Por qué el proceso del servicio se elimina cuando lo inicie con startService () ??

editar

El servicio utilizado para reiniciar antes de cerrar la aplicación desde la bandeja de aplicaciones. Pero ahora de repente con el mismo código, no lo hace. Sucede con otras aplicaciones también cuando las cierro. p.ej.

Introduzca aquí la descripción de la imagen

6 Solutions collect form web for “El proceso del servicio se cancela después de que la aplicación se elimina de la bandeja de aplicaciones”

Aquí hay una solución que encontré y funciona bien para reiniciar un servicio si su proceso se destruye al cerrar la aplicación. En su servicio, agregue el código siguiente.

Me encontré con esta solución en este hilo.

 @Override public void onTaskRemoved(Intent rootIntent){ Intent restartServiceIntent = new Intent(getApplicationContext(), this.getClass()); restartServiceIntent.setPackage(getPackageName()); PendingIntent restartServicePendingIntent = PendingIntent.getService(getApplicationContext(), 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT); AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); alarmService.set( AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 1000, restartServicePendingIntent); super.onTaskRemoved(rootIntent); } 

Parece ser un error que el proceso de la aplicación es asesinado. No tiene sentido que un servicio se ejecute si su proceso se destruye.

Tenga en cuenta que: onDestroy no siempre se llama. No debes poner código de esa manera.
Cuando la actividad forzada cerrada o cerrada por el sistema anormalmente, onDestroy no se llama.

Sé que esta pregunta es vieja pero encontré recientemente este problema y de repente mi servicio consigue parado en el cierre de la aplicación. Antes estaba funcionando bien. Este problema desperdició mi mucho tiempo. Para otras personas que tienen problemas similares, asegúrese de que SU RESTRICCIÓN DE DATOS DE FONDO ESTÁ APAGADA. Este fue el problema que tuve y que realmente tiene sentido como cuando los datos de fondo es Proceso de fondo restringido no se ejecutará.

Lamentablemente, este es un problema complicado debido a la forma en que funciona Android. Hay una serie de estrategias que cada uno trabaja en torno a diferentes partes del problema. Para obtener los mejores resultados se combinan múltiples estrategias.

Tenga en cuenta que algunas de estas estrategias pueden no ser necesarias en las versiones más recientes de Android.

1. Iniciar una actividad

Qué hacer

Tomado del servicio del primer plano matado al recibir la difusión después de acitivty barrido lejos en lista de la tarea :

En el servicio de primer plano:

  @Override public void onTaskRemoved( Intent rootIntent ) { Intent intent = new Intent( this, DummyActivity.class ); intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK ); startActivity( intent ); } 

En el manifiesto:

  <activity android:name=".DummyActivity" android:theme="@android:style/Theme.NoDisplay" android:enabled="true" android:allowTaskReparenting="true" android:noHistory="true" android:excludeFromRecents="true" android:alwaysRetainTaskState="false" android:stateNotNeeded="true" android:clearTaskOnLaunch="true" android:finishOnTaskLaunch="true" /> 

(Si su servicio se encuentra en un proceso diferente, establezca el proceso de esta actividad en el mismo).

En DummyActivity.java:

  public class DummyActivity extends Activity { @Override public void onCreate( Bundle icicle ) { super.onCreate( icicle ); finish(); } } 

Efectos secundarios

Provoca que la actividad de cierre se cierre. Normalmente, el borrado de una aplicación no cierra la actividad de los últimos.

Desventajas

Esto sólo tiene efecto cuando la actividad realmente se inicia , lo que puede tardar medio segundo o más, por lo que todavía deja el servicio abierto a la muerte por un poco.

Explicación

Al quitar o deslizar la aplicación, se establece un indicador denominado waitingToKill . Mientras este indicador está establecido, Android puede matar el proceso en cualquier momento en el futuro , como cuando recibe una transmisión . El inicio de una actividad borra este indicador.

2. Spam un BroadcastReceiver con las emisiones del primero plano

Qué hacer

Combina esto en tu código de servicio:

 if (Build.VERSION.SDK_INT >= 16) { Intent intent = new Intent(this, DummyReceiver.class); intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); //This seems to be timing-related; the more times we do this, //the less likely the process gets killed for (int i = 0; i < 50; ++i) sendBroadcast(intent); } 

Cree un receptor de difusión ficticio:

 public class DummyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) {} } 

Agregue el receptor a su manifiesto:

 <receiver android:name=".DummyReceiver" /> 

Efectos secundarios

Puede causar un ligero (~ 250ms) retraso / bloqueo cuando la tarea se elimina de la pantalla de recientes.

Desventajas

Esto sólo mantiene el proceso vivo mientras recibe las emisiones. waitingToKill indicador waitingToKill todavía está configurado , por lo que el proceso puede ser aún matado después, como cuando se recibe una emisión.

Explicación

Si su proceso no se está ejecutando en prioridad de primer plano, Android intentará matarlo inmediatamente . Recibir emisiones en primer plano temporalmente impide que esto, lo que resulta en el indicador waitingToKill que se establece en su lugar.

3. No vincular a los servicios

La vinculación a un servicio parece aumentar la probabilidad de que el proceso del servicio se destruya inmediatamente cuando se elimina una tarea.

OnDestroy no siempre se llama. El problema principal en su caso es que no se puede iniciar el servicio cuando la aplicación se cierra, que el sistema Android de tiempo ( en algunos sistemas operativos ) va a matar el servicio, Si no eres capaz de reiniciar el servicio a continuación, esta,

El manifiesto es,

  <service android:name=".BackgroundService" android:description="@string/app_name" android:enabled="true" android:label="Notification" /> <receiver android:name="AlarmReceiver"> <intent-filter> <action android:name="REFRESH_THIS" /> </intent-filter> </receiver> 

IN Principio Actividad inicio alarma pesebre de esta manera,

 String alarm = Context.ALARM_SERVICE; AlarmManager am = (AlarmManager) getSystemService(alarm); Intent intent = new Intent("REFRESH_THIS"); PendingIntent pi = PendingIntent.getBroadcast(this, 123456789, intent, 0); int type = AlarmManager.RTC_WAKEUP; long interval = 1000 * 50; am.setInexactRepeating(type, System.currentTimeMillis(), interval, pi); 

Esto llamará reciver y reciver es,

 public class AlarmReceiver extends BroadcastReceiver { Context context; @Override public void onReceive(Context context, Intent intent) { this.context = context; System.out.println("Alarma Reciver Called"); if (isMyServiceRunning(this.context, BackgroundService.class)) { System.out.println("alredy running no need to start again"); } else { Intent background = new Intent(context, BackgroundService.class); context.startService(background); } } public static boolean isMyServiceRunning(Context context, Class<?> serviceClass) { ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningServiceInfo> services = activityManager.getRunningServices(Integer.MAX_VALUE); if (services != null) { for (int i = 0; i < services.size(); i++) { if ((serviceClass.getName()).equals(services.get(i).service.getClassName()) && services.get(i).pid != 0) { return true; } } } return false; } } 

Y este recién llegado Alaram llama una vez cuando la aplicación android se abre y cuando la aplicación es closed.SO el servicio es así,

 public class BackgroundService extends Service { private String LOG_TAG = null; @Override public void onCreate() { super.onCreate(); LOG_TAG = "app_name"; Log.i(LOG_TAG, "service created"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(LOG_TAG, "In onStartCommand"); //ur actual code return START_STICKY; } @Override public IBinder onBind(Intent intent) { // Wont be called as service is not bound Log.i(LOG_TAG, "In onBind"); return null; } @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) @Override public void onTaskRemoved(Intent rootIntent) { super.onTaskRemoved(rootIntent); Log.i(LOG_TAG, "In onTaskRemoved"); } @Override public void onDestroy() { super.onDestroy(); Log.i(LOG_TAG, "In onDestroyed"); } } 

Cuando no hay vinculación a un servicio o un primer plano bien establecido entonces el sistema androide reconocer el servicio como servicio de sobrecarga no utilizado que debe ser cerrado. Esta es la mejor manera de mantener su servicio incluso si la aplicación está cerrada: AlarmManager o Service

  • Android Service ha filtrado a pesar de que es (supuestamente) no se ejecuta
  • ¿Cómo ejecuto un método de servicio periódicamente?
  • ¿Cómo implementar funcionalidades como Facebook "New Story" característica?
  • Android: ¿Cómo solucionar la falla de la conexión de la API de Google desde un servicio?
  • Detectando Android L Battery Saver
  • Android: Detener / iniciar servicio creado en onCreate ()
  • START_STICKY y START_NOT_STICKY
  • BroadcastReceiver cuando se cambia el estado de la red wifi o 3g
  • OnBind () en servicio siempre devuelve Falso - Android
  • Android O: Servicio no detenido por límites de ejecución de fondo
  • ¿Es correcto llamar a Service.startService () desde Service.onBind ()?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.