volver samsung recuperar porque poner pantalla como clima actualiza accuweather android android-appwidget visible

android - samsung - poner clima en pantalla huawei



Android: ¿cómo actualizar el widget a menudo pero solo cuando está visible? (4)

  1. Puede preguntarle al PowerManager acerca de isScreenOn ()
  2. Puedes registrarte para la Intención ACTION_SCREEN_OFF / ACTION_SCREEN_ON y encender o apagar el temporizador en consecuencia.

Aunque la respuesta anterior con respecto al AlarmManager es correcta, puede que no sea suficiente ya que observé que muchos teléfonos también emiten alarmas, incluso si no son del tipo * _WAKEUP. Esto puede suceder si hay otras aplicaciones instaladas que están activando el dispositivo. Y si una vez está despierto, entrega todas las alarmas pendientes.

Voy a crear un widget que necesita actualizar su contenido cada minuto (muestra datos relacionados con el tiempo).

Sin embargo, no es necesario actualizar el widget si actualmente es invisible, lo que significa:

  • la pantalla está apagada
  • otra aplicación se está ejecutando
  • El widget se coloca en otra pestaña de la pantalla de inicio (invisible)

¿Cuál es la mejor manera de actualizar solo los widgets visibles cada minuto, sin reactivar el dispositivo ni hacer cálculos innecesarios? Una vez que el widget se vuelve visible, un pequeño retraso antes de la actualización es aceptable.


Encontré esto en un proyecto llamado 24clock en código goole . Intenta No actualizar el widget mientras el usuario está fuera de casa:

ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); List<RunningTaskInfo> runningTasks = am.getRunningTasks(2); for (RunningTaskInfo t : runningTasks) { if (t != null && t.numRunning > 0) { ComponentName cn = t.baseActivity; if (cn == null) continue; String clz = cn.getClassName(); String pkg = cn.getPackageName(); // TODO make this configurable if (pkg != null && pkg.startsWith("com.android.launcher")) { return true; } return false; } }

Podría ser una respuesta para su requisito # 2. Aunque podría no funcionar bajo otros lanzadores de terceros.

== Actualizar ==

Unos meses después, de repente tengo una idea en mi mente acerca de cómo detectar si se muestra la pantalla de inicio. Lo puse en mi blog y ejecuté la prueba en mi deseo y funciona bien. El método consiste en consultar el Android para todos los paquetes instalados, uno de los cuales contiene la capacidad de "Iniciador", y luego verificar si está en la parte superior de la pila en ejecución. Si alguien lo ha probado, hágame saber el resultado también, ya que no tengo acceso a otros dispositivos Android.


La respuesta aceptada de mbaird golpea el clavo en la cabeza. El onVisivilityChange() propuesto onVisivilityChange() , si se implementa, debe cubrir todos los casos anteriores.

Mientras tanto, esto sigue siendo un problema real para algunos tipos de widgets. jom introdujo la posibilidad de registrarse para recibir intenciones ACTION_SCREEN_OFF / ACTION_SCREEN_ON. Esto es útil porque confiar en una alarma recurrente que no sea de activación no es suficiente, ya que otros servicios pueden causar activaciones. Es difícil porque tales acciones no pueden suscribirse a través de AndroidManifest.xml y AppWidgetProvider no tiene permitido llamar a context.registerReceiver() . Estos problemas se discuten en varias otras preguntas de , incluida la escucha de ACTION_SCREEN_OFF , android.intent.action.SCREEN_ON no funciona como un filtro de intención del receptor y Android: ¿cómo recibir intenciones de transmisión ACTION_SCREEN_ON / OFF? .

He logrado suscribirme a los intentos ACTION_SCREEN_OFF / ACTION_SCREEN_ON en un widget creando una instancia subsidiaria de BroascastReceiver y usando context.getApplicationContext().registerReceiver() BroascastReceiver context.getApplicationContext().registerReceiver() para registrarlo. Esto podría estar haciendo trampa y, al menos en alguna versión posterior de Android, puede fallar en la etapa de registro o quizás los eventos simplemente no se entregarán. He codificado para manejar estos casos pero por ahora funciona. Desafortunadamente, por supuesto, esto fallará cuando la aplicación se elimine alguna vez.

Otra posibilidad es usar el isHomeScreenShowing() , como se describe here , referenciado por la respuesta de xandy. Las ideas allí probablemente podrían optimizarse almacenando en caché la lista generada de aplicaciones CATEGORY_HOME instaladas y escuchando las transmisiones ACTION_PACKAGE_ADDED / CHANGED / REMOVED para actualizarlas.

Mi estrategia es:

  • Trate de evitar ser llamado (a través de una alarma que se repite) cuando no está visible.
  • Cuando se le llame, verifique el estado de la pantalla y otros indicadores de visibilidad antes de hacer algo costoso.
  • Solo entonces invoque un IntentService para manejar un trabajo relativamente costoso, que incluye una conexión de red persistente. Esto es necesario para monitorear el estado de un servicio remoto casi en tiempo real.

Para evitar la actualización cuando la pantalla está apagada, use el AlarmManager para programar una alarma recurrente que no active el teléfono.

Los otros dos puntos que tiene en su pregunta no son posibles. No hay manera de detectar si su widget está en una pantalla de inicio que no está visible actualmente, y no hay manera de determinar si una aplicación se está ejecutando y está ocultando la pantalla de inicio. He presentado un ticket en http://b.android.com solicitando que esta funcionalidad se agregue a Android. Si tiene ganas de protagonizarlo, le ayudará a obtener prioridad: http://code.google.com/p/android/issues/detail?id=5529&q=reporter:mark.r.baird&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars