在如何使用BroadcastReceiver中,我們知道怎麼發出一個廣播, 以及接收一個廣播, 其實在系統中,有很多廣播訊息隨時在傳送, 我們就示範如何抓取電池的廣播當範例。
情境
其實電池會傳送許多的訊息,如電量,溫度,或者目前是否在充電等等,那麼我們就把這些訊息一一列出來。
完整程式碼
如果想觀看完整程式碼,可以到 GitHub 上觀看或下載。
程式碼解說
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
registerReceiver(mBroadcastReceiver, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
}
private val mBroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(p0: Context?, info: Intent?) {
if (Intent.ACTION_BATTERY_CHANGED == info?.action) {
val level = info.getIntExtra("level", 0)
val scale = info.getIntExtra("scale", 0)
val status = info.getIntExtra("status", 0)
val health = info.getIntExtra("health", 0)
val temperature = info.getIntExtra("temperature", 0)
val technology = info.getStringExtra("technology")
val information = StringBuilder()
information.append("Level:$level\n")
information.append("Scale:$scale\n")
information.append("Battery:$level%\n")
when (status) {
BatteryManager.BATTERY_STATUS_CHARGING -> information.append("Status:" + "CHARGING" + "\n")
BatteryManager.BATTERY_STATUS_DISCHARGING -> information.append("Status:" + "DISCHARGING" + "\n")
BatteryManager.BATTERY_STATUS_FULL -> information.append("Status:" + "FULL" + "\n")
BatteryManager.BATTERY_STATUS_NOT_CHARGING -> information.append("Status:" + "NOT_CHARGING" + "\n")
BatteryManager.BATTERY_STATUS_UNKNOWN -> information.append("Status:" + "UNKNOWN" + "\n")
}
when (health) {
BatteryManager.BATTERY_HEALTH_DEAD -> information.append("Health:" + "DEAD" + "\n")
BatteryManager.BATTERY_HEALTH_GOOD -> information.append("Health:" + "GOOD" + "\n")
BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE -> information.append("Health:" + "OVER_VOLTAGE" + "\n")
BatteryManager.BATTERY_HEALTH_OVERHEAT -> information.append("Health:" + "OVERHEAT" + "\n")
BatteryManager.BATTERY_STATUS_UNKNOWN -> information.append("Health:" + "UNKNOWN" + "\n")
BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE -> information.append("Health:" + "UNSPECIFIED_FAILURE" + "\n")
}
information.append("Temperature:" + (temperature * 0.1).toString() + "\n")
information.append("Technology:$technology\n")
info_text.text = information
}
}
}
override fun onPause() {
super.onPause()
unregisterReceiver(mBroadcastReceiver)
}
}
首先我們在onCreate註冊一個廣播,然後馬上解除註冊廣播, 原因是因為當我們註冊一個廣播以後,抓取的是電池的電量變化, 而電池的電量隨時在變動,因此只要一註冊,就可以馬上抓到電池的訊息。
那我們來看看電池有哪些訊息可以接收,由於我們電池的訊息非常的多種,我就稍微列幾個來作說明,有興趣的可以參考官方網站,最主要的訊息有以下訊息。
Level: 電池目前的電量 以Scale為準
Scale: 電池最大的電量 通常最大為100
Health: 電池的健康狀況 可是使用BatteryManager看常數,Battery_Health_XX就是了
Status: 電池的狀態 可以使用BatteryManager看常數,Battery_Status_XX就是了
Temperature: 電池的溫度 以0.1為單位,因此要乘上0.1
Technology: 電池的類型 例如Li-ion
由於我們的最大電量是100, 而目前電量換成百分比是 目前電量/最大電量*100%
所以剛好就變成 目前電量% 就是百分比了。