El servicio no se reinicia después de que "Clear Memory" + appWidget se bloquea

He construido un appWidget que registran algunos servicios en su método onEnabled ().

El problema es que después de usar la función Clean Memmory / Ram de Task Manager, la vista de appWidget se bloquea (todos los textos de TextWare de appWidgets se configuran como predeterminados (TextView)) y los Servicios dejan de ejecutarse y nunca se reinician.

Esto sólo sucede después de algún tiempo el widget se establece, y si limpio Memmory / Ram derecho después de que el widget se establece el error no sucede, pero supongo que esto está relacionado con el método del Administrador de tareas de limpieza de RAM.

Así que finalmente, mi pregunta es: ¿Hay una manera de decirle al sistema androide que reStart esos servicios? ya que otros appWidgets que he descargado a través del mercado parece seguir funcionando bien después de este procedimiento.

Será feliz por las ideas y soluciones! Gracias avanzado, Gal 🙂

algún código que uso:

el método onEnabled () en el appWidget:

@Override public void onEnabled(Context context) { super.onEnabled(context); Intent newinIntent = new Intent(context, CallService_1x1.class); context.startService(newinIntent); newinIntent = new Intent(context, SmsService_1x1.class); context.startService(newinIntent); } 

Algunos métodos de uno de los Servicios (otros servicios son muy similares ya que es de su método abstracto):

  @Override public int onStartCommand(Intent intent, int flags, int startId) { // We want this service to continue running until it is explicitly // stopped, so return sticky. Log.d("SERVICE-SMS","CallMonitorService - onStartCommand created"); return START_STICKY; } @Override public void onCreate() { super.onCreate(); context = this.getApplicationContext(); Log.d("SERVICE-SMS","CallMonitorService created"); registerObserver(); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); } @Override public void onDestroy() { unregisterObserver(); super.onDestroy(); } @Override public IBinder onBind(Intent intent) { return null; } /** * Start the service to process that will run the content observer */ public static void beginStartingService(Context context) { Log.d("SERVICE-SMS","CallMonitorService: beginStartingService()"); context.startService(new Intent(context, CallService.class)); } /** * Called back by the service when it has finished processing notifications, * releasing the wake lock if the service is now stopping. */ public static void finishStartingService(Service service) { Log.d("SERVICE-SMS","CallMonitorService: finishStartingService()"); service.stopSelf(); } 

3 Solutions collect form web for “El servicio no se reinicia después de que "Clear Memory" + appWidget se bloquea”

Después de un montón de investigación y algunos intentos, lo resuelto! 🙂

Acaba de añadir BroadcastReciever escuchando los cambios y actualizaciones del paquete:

registre el receptor en el archivo de manifiesto:

 <receiver android:name=".receivers.onRestartReciever"> <intent-filter> <action android:name="android.intent.action.PACKAGE_REPLACED" /> <action android:name="android.intent.action.PACKAGE_RESTARTED" /> <data android:scheme="package" android:path="my.Package.Path" /> </intent-filter> 
  • PACKAGE_REPLACED – llamado en particular para notificar la actualización de la aplicación.
  • PACKAGE_RESTARTED – llamado cuando la mayoría de los limpiadores de memmory están limpiando memmory.
  • la fila "datos" se utiliza para supervisar la acción aplicada para el paquete específico.

Dentro de este reciever comienzo mis servicios otra vez, y recomiendo la vista del widget (llamando su método del onUpdate () en este caso):

 public class onRestartReciever extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Log.d("DEBUG", "onRestartReciever"); // Register Services MyWidget_1x1.registerServices(context); MyWidget_2x2.registerServices(context); // reInitialize appWidgets AppWidgetManager appWidgetManager=AppWidgetManager.getInstance(context); MyWidget_1x1 widget1x1=new CallWidgi(); widget1x1.onUpdate (context, AppWidgetManager.getInstance(context), widget1x1.getIDs(context, appWidgetManager)); MyWidget_2x2 widget2x2=new CallWidgi2(); widget2x1.onUpdate(context, AppWidgetManager.getInstance(context), widget2x2.getIDs(context, appWidgetManager)); } } 

registerServices (Context) es un método estático en mis clases de AppWidgetProvider (MyWidget_1x1 / MyWidget_2x2) que registra los servicios necesarios.

Espero que te ayude también =]

Las cosas anteriores no detectan el evento de reinicio pero fallan al detectar el evento de memoria clara, porque el android.intent.action.PACKAGE_RESTARTED no se envía al propio paquete.

He resuelto esto mediante la adición de un servicio. Este servicio recibe su onCreate () llamado a un evento de memoria clara. Tenga en cuenta que debe iniciar el servicio con una llamada startService, que llamo desde AppWidgetProvider.

 Intent i= new Intent(context, CTService.class); // potentially add data to the intent i.putExtra("KEY1", "Value to be used by the service"); ComponentName name = context.startService(i); 

El código de servicio es como:

 @Override public void onCreate() { Log.d(TAG,"onCreate"); ping(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(TAG,"onStartCommand: "+intent.getAction()); //TODO do something useful ping(); return Service.START_STICKY; } 

con ping las cosas reales que hace que los eventos de toque en los widgets funcionen.

Gracias por investigar con éxito su propia solución. Me apuntaste en la dirección correcta. Yo estaba teniendo un problema similar donde el appwidget no se actualizaría más después de un reinicio o ciclo de alimentación, ni tampoco responder a los clics del botón más.

Lo que hice fue añadir primero lo siguiente al manifiesto:

 <receiver android:name=".BootReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver> 

Entonces creé un archivo BootReceiver.java con algo como lo siguiente. En mi caso tuve que recrear la alarma y las intenciones pendientes de los botones.

 public class BootReceiver extends BroadcastReceiver { /* * after reboot widget appears to stop working and becomes unresponsive to clicks * this broadcast receiver will create new alarm and refresh pending intents */ @Override public void onReceive(Context context, Intent intent) { /* do your stuff here, mostly just copy&paste from other places */ } } 

Algunos créditos para esto también van a: Las alertas de proximidad no funcionan después del reinicio del teléfono

  • Picasso: cargar imágenes en widget listview
  • Cómo cambiar el diseño del widget de fondo mediante programación
  • Cómo encontrar el continente en una ubicación determinada usando Geocoder en la aplicación android
  • Widget de Android que parece exactamente un icono de lanzador
  • Widget Android ImageButton pierde imagen cuando se gira la pantalla
  • Android widget ¿cómo puede obtener el tiempo en hora y minuto de esto?
  • Recursos android de escala automática
  • Obtener el identificador de diseño de cadena, no funcionará
  • ¿Hay alguna manera de poner un campo EditText / entrada en un widget homescreen?
  • ¿Cuál es la diferencia para actualizar Android App Widget entre dos enfoques?
  • Widget de control de energía mostrado durante un breve momento al actualizar mi propio widget a través de AppWidgetManager, ¿cuál es el problema?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.