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);
- Anfitrión androide de Android y sueño del dispositivo
- Por favor, explique algunos conceptos de servicio de Android
- ¿Cómo iniciar el servicio con Alarm Manager en Android?
- Firebase + Android - Notificaciones ChildAdded - ¿Cómo obtener sólo New Childs?
- Aplicación de Android como servicio sin actividad
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.
- ¿Cómo podemos evitar que un servicio muera por un sistema operativo?
- Notificación RemoteView en el oyente de clics
- StopService () detendrá un servicio de primer plano?
- PeekService () devuelve null aunque el servicio se está ejecutando, si el servicio es reiniciado por el sistema después de matar OOM
- ¿Está garantizado un servicio android para llamar a onDestroy ()?
- Análisis BLE de Android en el servicio de fondo
- No se puede iniciar el servicio Intención: no se encuentra
- El servicio se está matando mientras se mantiene el bloqueo de la estela y después de llamar a startForeground
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
- El menú desplegable de visualización web de Android no funciona en dispositivos Android 4.x
- Tecla de hash de Facebook al usar el estudio de Android