60 likes | 250 Views
Monitoring battery power. 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
E N D
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?
Make a new app, BatteryLevelFun • Add textView to UI, with Id textView1 • In BatteryLevelFunActivity • Add member variable • TextViewtextView; • IntentFilterbatteryLevelFilter = 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 • BroadcastReceiverbatteryLevelReceiver = new BroadcastReceiver() { • public void onReceive(Context context, Intent intent) { • processBatteryIntent(intent); • } • };
Function to process battery intent • DateTimelastTime = null; • double lastLevel; • public void processBatteryIntent(Intent intent) { • DateTimecurrentTime = new DateTime(); // needs joda time • String batteryStr = new String(); • intrawlevel = 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 += "\nbatterytemperture: "+((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); • }
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);