android - El servicio se bloquea en ''muerte'' de la actividad
service crash (3)
Cuando ejecuto la aplicación y vuelvo a la pantalla de inicio, el servicio sigue en funcionamiento. Pero después de un tiempo recibo estos mensajes de logcat, y el servicio se detiene ... ¿Cómo puedo evitar esto?
No lo haces, hablando en general.
Los servicios no están diseñados para ejecutarse para siempre. Demasiados desarrolladores han comenzado servicios y nunca los han detenido. Y, en su caso, lo hacen sin una buena razón. Tener un servicio en la memoria solo mirando el reloj es un desperdicio, y es particularmente porque los desarrolladores hacen cosas como esta que Android "bloquea" los servicios después de que permanecen demasiado tiempo.
En su caso, cambie para usar AlarmManager
, probablemente junto con un servicio de IntentService
, por lo que el servicio se cierra por sí solo cuando ya no queda trabajo por hacer.
Tengo una actividad que inicia un servicio.
En mi actividad:
startService(new Intent(this, MyService.class));
En mi servicio, onStart ():
/* Show notification */
int icon = R.drawable.icon;
tickerText = getResources().getString(R.string.app_name);
long when = System.currentTimeMillis();
contentTitle = getResources().getString(R.string.app_name);
contentText = getResources().getString(R.string.running);
Intent notificationIntent = new Intent(this, activityClass).setAction(Intent.ACTION_MAIN).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification = new Notification(icon, tickerText, when);
notification.setLatestEventInfo(this, contentTitle, contentText, contentIntent);
notification.flags = Notification.FLAG_ONGOING_EVENT;
((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)).notify(0, notification);
startForeground(0, notification);
El servicio tiene un temporizador que funciona un poco cada 3-4 minutos, y difunde información a la Actividad si es posible. Cuando se cierra la Actividad, el Servicio debe seguir haciendo su trabajo.
Cuando ejecuto la aplicación y vuelvo a la pantalla de inicio, el servicio sigue en funcionamiento. Pero después de un tiempo recibo estos mensajes de logcat y el servicio se detiene:
07-03 16: 55: 09.440: INFO / ActivityManager (583): Process com.myapp (pid 11665) ha muerto. 07-03 16: 55: 09.440: WARN / ActivityManager (583): Programación del reinicio del servicio bloqueado com.myapp / .MyService en 5000ms
¿Cómo puedo prevenir esto?
Deberá considerar que su servicio se ejecute como un Remote Service
, para que se ejecute en su propio proceso.
Un blog sobre servicios remotos: http://saigeethamn.blogspot.com/2009/09/android-developer-tutorial-part-9.html
Un ejemplo de ejemplo: http://about-android.blogspot.com/2010/02/android-remote-service-sample.html
Las respuestas proporcionadas no me ayudaron. Pero encontré una forma realmente fácil de hacerlo, agregar el Manifiesto
<service android:name="..." android:process=":remote" />
http://developer.android.com/guide/topics/manifest/service-element.html
Solo estoy probando en este momento, mi actividad ya murió, pero mi servicio se está ejecutando.