ACTION_BATTERY_CHANGED disparando como loco
Bueno, estoy trabajando en un AppWidget que comprueba el nivel de la batería y lo muestra en un TextView. Mi código se ve así:
public class BattWidget extends AppWidgetProvider { private RemoteViews views = new RemoteViews("com.nickavv.cleanwidgets", R.layout.battlayout); @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int appWidgetIds[]) { final int N = appWidgetIds.length; context.getApplicationContext().registerReceiver(this,new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); for (int i = 0; i < N; i++) { int appWidgetId = appWidgetIds[i]; appWidgetManager.updateAppWidget(appWidgetId, views); } } @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); Log.d("onReceive", "Received intent " + intent); if (intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)) { Integer level = intent.getIntExtra("level", -1); views.setTextViewText(R.id.batteryText, level+"%"); AppWidgetManager myAWM = AppWidgetManager.getInstance(context); ComponentName cn = new ComponentName(context, AirWidget.class); onUpdate(context, myAWM, myAWM.getAppWidgetIds(cn)); } } }
Y me estoy preocupando porque tan pronto como suelte el widget en mi pantalla de inicio, comienza a disparar cerca de 100 de esas llamadas de registro por segundo, diciendo que está recibiendo ACTION_BATTERY_CHANGED. ¿No se supone que esto sólo se difundirá por cada porcentaje de disminución? Realmente causó que mi lanzador entero se retrasara, tuve que desinstalarlo. Eso no puede estar bien.
- ¿Cómo obtener el nivel de la batería después de conectarse al dispositivo BLE?
- ¿Cómo gestiona la salud de la batería de sus dispositivos de desarrollo cuando siempre está conectado?
- ¿Cómo probar la velocidad de carga de la batería?
- ¿No puedo recibir la emisión en el cambio de estado de la batería?
- ¿Cómo puedo saber cuánta batería consume mi aplicación de Android en los dispositivos del usuario?
- Determine la proximidad del teléfono Android al punto conocido mientras conserva la energía
- Notificaciones push de Pubnub y duración de la batería en Android
- La obtención de un cable USB conectado al evento IN / OUT utilizando EXTRA_PLUGGED no funciona
- Android - detalles de uso de la batería
- Reconocimiento de actividades de Google Play Services - ¿Uso de la batería?
- Determinar la entrada específica del cargador
- Cómo encontrar el tiempo de recarga de la batería de android móvil programatically?
- El consumo de la batería mientras TCP está abierto para ADB vía wifi puede conectar
Mi código se ve así:
No puede registrar un BroadcastReceiver
de otro BroadcastReceiver
y obtener resultados confiables. Android finalizará el proceso, ya que no cree que se esté ejecutando nada. La única manera de escuchar ACTION_BATTERY_CHANGED
será registrar ese receptor de una actividad o un servicio.
¿No se supone que esto sólo se difundirá por cada porcentaje de disminución?
¿Dónde ves eso documentado? AFAIK, ACTION_BATTERY_CHANGED
será transmitido siempre que el hardware se sienta como él. Además, tenga en cuenta que otros datos cambian dentro de esa Intent
, como la temperatura.
Si desea implementar este widget de aplicación, no se registre en ACTION_BATTERY_CHANGED
la forma en que está. En lugar:
- Permitir que el usuario elija un período de votación a través de una
SharedPreference
(por ejemplo, una vez por minuto, una vez cada 15 minutos) - Use
AlarmManager
para darle control sobre ese período de sondeo a través de ungetBroadcast()
PendingIntent
- En ese
BroadcastReceiver
, llame aregisterReceiver()
paraACTION_BATTERY_CHANGED
pero con un BroadcastReceivernull
, ya que esto le devolverá el últimoIntent
que fue difundido para esa acción (nota: seguirá necesitando usargetApplicationContext()
para esto) - Utilice
AppWidgetManager
para actualizar las instancias de los widgets de la aplicación con el nivel de batería extraído de laIntent
que recuperó en el paso anterior (nota: si está configurando que todos sean iguales, no necesitará iterar sobre los ID.updateAppWidget()
que toma unComponentName
como un parámetro)
Esto tiene varias ventajas:
- No importa cuantas veces se transmite
ACTION_BATTERY_CHANGED
- El usuario consigue controlar cuánta batería usted consume haciendo estas comprobaciones (debe ser insignificante si usted guarda el período de la encuesta a un minuto o más)
- Su proceso puede terminar de forma segura entre las encuestas, por lo que es menos probable que los usuarios lo ataquen con asesinos de tareas y de forma semipermanente estropear su aplicación
Bueno, tu onUpdate está registrando su propia clase como receptor para la información de batteryinfo. Esta intención se activa inmediatamente para la primera información. Su onReceive está llamando a su onUpdate de nuevo. Llamamos a esto un bucle. Por lo tanto, los 100 registros por segundo …
- Cómo guardar la clave del API en gradle.properties
- Android eclipse startManagingCursor Deprecated pero quiere soportar versiones anteriores de la API?