Android – widget de actualización sobre el servicio con datos de la red. ¿El mejor enfoque?

Tengo una pregunta sobre los widgets de Android y sobre todo los servicios de Android. Esto es lo que quiero hacer: En el teléfono el usuario debe ser capaz de agregar mi widget a su pantalla de inicio. El widget obtiene sus datos de la red. Después de leer algunos tutrials acerca de esto, descubrí que el mejor enfoque sería crear un servicio que obtiene los datos de la red (sockets TCP) y luego actualiza el widget constantemente. Esto se hace con ScheduledExecutorService que ejecuta un Runnable en un cierto intervalo. El Runnable se conectará a un servidor, obtendrá los datos y deberá actualizar el widget).

Mi problema es ahora, que el widget no necesita ser actualizado cuando la pantalla está apagada y por lo que el servicio no debe ejecutarse debido a la batería de drenaje. Mi pregunta es: ¿Cómo hacerlo de la mejor manera?

He encontrado dos enfoques que harían más o menos lo que quiero:

  1. Cuando se añada la primera instancia del widget a la pantalla de inicio, registrará un receptor de difusión que reciba la acción de intención ACTION_SCREEN_ON y ACTION_SCREEN_OFF del sistema operativo Android. Si ACTION_SCREEN_ON se activa, se iniciará el servicio de actualización, de lo contrario se detendrá. Pero estoy realmente inseguro si eso es un buen enfoque debido a la vida del receptor de radiodifusión.

  2. En Runnable del servicio de actualización, que se ejecuta periódicamente por el ScheduledExecutorService y realmente hace las cosas de red, compruebo a través de PowerManager.isScreenOn (), si la pantalla está encendida. En caso afirmativo, ejecuto el código de red, de lo contrario no. Pero, ¿qué ocurre cuando el dispositivo está en modo de espera? ¿Se ejecuta este código entonces? ¿Qué pasa con el drenaje de la batería aquí?

¿Existe quizás un enfoque de "mejores prácticas" para lo que quiero hacer? He leído mucho acerca de AlarmManager y que es una herramienta muy potente. ¿Puede programar tareas con esto de la manera, que sólo se ejecutan cuando la pantalla está encendida?

Gracias por tu ayuda.

Saludos cordiales NiThDi

2 Solutions collect form web for “Android – widget de actualización sobre el servicio con datos de la red. ¿El mejor enfoque?”

La primera solución (widget que maneja las transmisiones de pantalla ON y OFF) al problema es el camino a seguir. Inicie un nuevo IntentService para una comunicación de fondo a su servidor de aplicaciones. Una vez que termine, envíe su difusión "Completed" personalizada con los resultados y luego manejarlo en su widget.

Como beneficio adicional, permitiría que múltiples instancias de tu widget funcionaran desde una "fuente" y no consumirían ningún recurso en caso de que el usuario no agregara ningún widget.

ACTUALIZACIÓN Como es imposible usar emisiones de pantalla ON / OFF con un widget, probablemente usaría esto (AlarmManager con una ELAPSED_REALTIME (no ELAPSED_REALTIME_WAKEUP )) para programar una ejecución de servicio (intención). De esta manera su servicio no se programará cuando la pantalla esté apagada, sino que se ejecutará periódicamente cuando esté encendido. Y si el retardo entre la pantalla de encendido y apagado es más que el período que se ejecutará inmediatamente en la pantalla de volver a ON.

En cuanto a su pregunta sobre la vida útil de receptores de radiodifusión, como se dijo antes, utilice IntentService para una larga tarea de ejecución y, a continuación, difundir los resultados de ella. Cuando usted comienza un servicio que la llamada no bloquea tan receptor de la difusión acabará en un asunto oportuno.

UPDATE 2 Según esta pantalla OFF no significa que el dispositivo está durmiendo. Ya tiene una solución a este problema utilizando PowerManager.isScreenOn ().

El enfoque ELAPSED_REALTIME podría funcionar, creo, pero extrañamente no es para una pequeña aplicación de prueba que he creado. Básicamente, la aplicación de prueba es un widget y un IntentService. El widget sólo muestra la hora actual, mientras que el servicio de intención obtiene la hora actual y envía una transmisión que el widget consume en el método onReceive () y se actualiza a sí mismo. El widget es, por supuesto, un receptor registrado para la acción de difusión personalizada. En el método onEnabled () del widget, inicializo la alarma para AlarmManager. Ahora un poco de código:

Widget onEnabled ():

 @Override public void onEnabled(Context c) { super.onEnabled(c); Intent intent = new Intent(c.getApplicationContext(), SimpleIntentService.class); PendingIntent intentExecuted = PendingIntent.getService(c.getApplicationContext(), 45451894, intent, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager alarmManager = (AlarmManager) c.getApplicationContext().getSystemService(Context.ALARM_SERVICE); alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, 0, 3000, intentExecuted); } 

Widget onReceive ():

 @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); if (intent.getAction().equals(ACTION_RESP)) { AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); ComponentName thisWidget = new ComponentName(context.getApplicationContext(), Widget.class); int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); for (int appWidgetId : allWidgetIds) { RemoteViews remoteViews = new RemoteViews(context.getApplicationContext().getPackageName(), R.layout.widget); String s = ""; if (intent.hasExtra("msg")) s = intent.getStringExtra("msg"); // Set the text remoteViews.setTextViewText(R.id.textView1, s); appWidgetManager.updateAppWidget(allWidgetIds, remoteViews); } } } 

SimpleIntentService onHandleIntent ():

 @Override protected void onHandleIntent(Intent intent) { Log.w("TestService", "SimpleIntentService onHandleIntent called."); String msg = new Date().toGMTString(); Intent broadcastIntent = new Intent(); broadcastIntent.setAction(Widget.ACTION_RESP); broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT); broadcastIntent.putExtra("msg", msg); sendBroadcast(broadcastIntent); } 

Por lo tanto, he probado esto en mi Nexus 4 con Android 4.2.1 y en un emulador con Android 4.0.4. En ambos casos se crea el SimpleIntentService y onHandleIntent () se llama cada 3 segundos, incluso cuando apague manualmente la pantalla. No tengo ni idea de por qué AlarmManager todavía programa la alarma, ¿tienes ?!

¡Gracias!

  • Android - Obtener el widget del cronómetro
  • Recursos android de escala automática
  • Cambiar gradualmente el fondo de gradiente del widget
  • ¿El widget Android deja de funcionar después de un tiempo?
  • ¿Cómo puedo agregar un nuevo botón en el widget del selector de fechas en android?
  • Obtener el identificador de diseño de cadena, no funcionará
  • Modificación del widget de barra de búsqueda de Android para que funcione verticalmente
  • ¿Cómo puedo hacer que un buscador Android se mueva sin problemas?
  • Widget de Android que parece exactamente un icono de lanzador
  • ¿Qué es exactamente un widget?
  • Android widget ¿cómo puede obtener el tiempo en hora y minuto de esto?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.