6
Monitoring battery power

Monitoring battery power. overview Battery usage is critical on mobile apps Measuring energy usage is a bit tricky since many processes Android provides

Embed Size (px)

Citation preview

Page 1: Monitoring battery power. overview Battery usage is critical on mobile apps Measuring energy usage is a bit tricky since many processes Android provides

Monitoring battery power

Page 2: Monitoring battery power. overview Battery usage is critical on mobile apps Measuring energy usage is a bit tricky since many processes Android provides

overview• Battery usage is critical on mobile apps• Measuring energy usage is a bit tricky since many processes • Android provides broadcast sticky intents on the battery level• The intent contents various information about the battery state• How can you get the current battery level?

– Do you have to wait for a change in battery level to receive a new intent that contains the new information?

– No, the OS generates a sticky intent, which will stay around until a new one is generated.

– As soon as you register to get a battey level change intent, you will get the most recent intent.

– After that, you will get the intents as they are generated• If your app is able to get them?

Page 3: Monitoring battery power. overview Battery usage is critical on mobile apps Measuring energy usage is a bit tricky since many processes Android provides

• Make a new app, BatteryLevelFun• Add textView to UI, with Id textView1• In BatteryLevelFunActivity

– Add member variable• TextView textView;• IntentFilter batteryLevelFilter = null;

– In onCreate, add• textView = (TextView)findViewById(R.id.textView1);

• //register to receive broadcast intents about battery level• batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);

– Make onResume• @Override• public void onResume() {

– super.onResume();– registerReceiver(batteryLevelReceiver, batteryLevelFilter);

• }

– Make onPause• @Override• public void onPause() {

– super.onPause();– unregisterReceiver(batteryLevelReceiver);

• }

– Object to receive broadcast intents• BroadcastReceiver batteryLevelReceiver = new BroadcastReceiver() {

– public void onReceive(Context context, Intent intent) {» processBatteryIntent(intent);

– }

• };

Page 4: Monitoring battery power. overview Battery usage is critical on mobile apps Measuring energy usage is a bit tricky since many processes Android provides

Function to process battery intent• DateTime lastTime = null;• double lastLevel;• public void processBatteryIntent(Intent intent) {

– DateTime currentTime = new DateTime(); // needs joda time– String batteryStr = new String(); – int rawlevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); – int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); – double level = -1;– if (rawlevel >= 0 && scale > 0) {

• level = (rawlevel * 100) / (double)scale;

– }

– double rate = 0;– if (lastTime!=null && lastLevel!=level) {

• rate = (level - lastLevel)/(currentTime.getMillis()-lastTime.getMillis())*1000.0;• batteryStr += String.format("charging rate: %f ", rate);• if (level>lastLevel)

– batteryStr += String.format("fully charged in %f hours\n", (100-level)/rate/3600.0);• else

– batteryStr += String.format("fully discharged in %f hours\n", (level)/-rate/3600.0);

– } – batteryStr += "current level: " + level + " last level: " + lastLevel + " ";

– if (lastTime==null || lastLevel!=level) {• lastTime = currentTime;• lastLevel = level;

– }

– batteryStr += "\nbattery temperture: "+((double)intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, -1)/10.0) + " degrees C\n";

– int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);– switch (plugged) {

• case 0:– batteryStr += "unplugged\n";– break;

• case BatteryManager.BATTERY_PLUGGED_AC:– batteryStr += "Plugged into AC\n";– break;

• case BatteryManager.BATTERY_PLUGGED_USB:– batteryStr += "Plugged into USB\n";– break;

• default: batteryStr += "unknown plugged state\n";

– }

– int health = intent.getIntExtra(BatteryManager.EXTRA_HEALTH, -1);– batteryStr += "battery health: ";– switch (health) {

• case BatteryManager.BATTERY_HEALTH_DEAD:– batteryStr += "dead\n"; break;

• case BatteryManager.BATTERY_HEALTH_GOOD:– batteryStr += "good\n"; break;

• case BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE:– batteryStr += "over voltage\n"; break;

• case BatteryManager.BATTERY_HEALTH_OVERHEAT:– batteryStr += "overheat\n"; break;

• case BatteryManager.BATTERY_HEALTH_UNKNOWN:– batteryStr += "unknown\n"; break;

• case BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE:– batteryStr += "some failure\n"; break;

– }– int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);– batteryStr += "battery status: ";– switch (status) {

• case BatteryManager.BATTERY_STATUS_CHARGING:– batteryStr += "charigng\n"; break;

• case BatteryManager.BATTERY_STATUS_DISCHARGING:– batteryStr += "discharging\n"; break;

• case BatteryManager.BATTERY_STATUS_FULL:– batteryStr += "full\n"; break;

• case BatteryManager.BATTERY_STATUS_NOT_CHARGING:– batteryStr += "not charing\n"; break;

• case BatteryManager.BATTERY_STATUS_UNKNOWN:– batteryStr += "unknown\n"; break;

– }– int voltage = intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1);– batteryStr += "battery voltage: "+ voltage + "\n";

– String technology = intent.getStringExtra(BatteryManager.EXTRA_TECHNOLOGY);– batteryStr += "battery technology: "+ technology +"\n";

– boolean present = intent.getBooleanExtra(BatteryManager.EXTRA_PRESENT, false);– if (present)

• batteryStr += "battery is present\n";

– else• batteryStr += "battery is not present\n";

– textView.setText(batteryStr);

• }

Page 5: Monitoring battery power. overview Battery usage is critical on mobile apps Measuring energy usage is a bit tricky since many processes Android provides

test• Run it. Try plugging and unplugging usb cable• It takes a while to get a new update

• Try registering broadcast receiver in onCreate and not in onResume and doing nothing in onPause. And then run it and back arrow– In onResume, delete

• registerReceiver(batteryLevelReceiver, batteryLevelFilter);

– In onPause, delete• unregisterReceiver(batteryLevelReceiver);

– In onCreate, add• registerReceiver(batteryLevelReceiver, batteryLevelFilter);

– Run it, and use backward arrow. • Might crash• Will give error message about a problem with a broadcast receiver

– The problem is that the broadcast receiver is registered, but the app is not running

• Get battery level immediately– In onCreate, add– Intent current = registerReceiver(null, batteryLevelFilter);– processBatteryIntent(current);

Page 6: Monitoring battery power. overview Battery usage is critical on mobile apps Measuring energy usage is a bit tricky since many processes Android provides