Okay, so I\'m working on an AppWidget that checks the battery level and displays it on a TextView. My code looks like this:
public class BattWidget extends A
Well, your onUpdate is registering its own class as receiver for the batteryinfo intent. This intent is then immediately triggered for the first info. Your onReceive is calling your onUpdate again. We call this a loop. Hence the 100 logs a second ...
My code looks like this:
You cannot register a BroadcastReceiver
from another BroadcastReceiver
and get reliable results. Android will terminate your process, because it doesn't think anything is running. The only way to listen for ACTION_BATTERY_CHANGED
will be to register that receiver from an activity or a service.
Isn't this only supposed to be broadcast for each percent decrease?
Where do you see that documented? AFAIK, ACTION_BATTERY_CHANGED
will be broadcast whenever the hardware feels like it. Also, bear in mind that other data changes within that Intent
, such as temperature.
If you want to implement this app widget, do not register for ACTION_BATTERY_CHANGED
the way you are. Instead:
SharedPreference
(e.g., once a minute, once every 15 mintues)AlarmManager
to give you control on that polling period via a getBroadcast()
PendingIntent
BroadcastReceiver
, call registerReceiver()
for ACTION_BATTERY_CHANGED
but with a null
BroadcastReceiver, as this will return to you the last Intent
that was broadcast for that action (note: you will still need to use getApplicationContext()
for this)AppWidgetManager
to update your app widget instances with the battery level pulled out of the Intent
you retrieved in the preceding step (note: if you are setting them all to be the same, you do not need to iterate over the IDs -- use the updateAppWidget()
that takes a ComponentName
as a parameter)This has several advantages:
ACTION_BATTERY_CHANGED
is broadcast