Android 電量監(jiān)控

本身就是一個廣播接收器(BroadcastReceiver),因此我們最初企圖直接用這個Widget接受ACTION_BATTERY_CHANGED廣播并作出反應(yīng),但卻發(fā)現(xiàn)這個接收器并不會接受電池更新的廣播(不論我們在配置文件中配置與否)。所以只能另尋出路,我們想到,可以使用一個單獨(dú)的為本W(wǎng)idget服務(wù)的Service,該Service檢測到電池電量更新后就更新桌面的Widget顯示。

Broadcast Action: This is a sticky broadcast containing the charging state, level, and other information about the battery. See BatteryManager for documentation on the contents of the Intent.

You can not receive this through components declared in manifests, only by explicitly registering for it with Context.registerReceiver(). See ACTION_BATTERY_LOW, ACTION_BATTERY_OKAY, ACTION_POWER_CONNECTED, and ACTION_POWER_DISCONNECTED for distinct battery-related broadcasts that are sent and can be received through manifest receivers.

This is a protected intent that can only be sent by the system.

package com.billhoo.study;

import android.app.Notification;? //通知,即顯示在屏幕左上角的小圖標(biāo)

import android.app.NotificationManager;

import android.app.PendingIntent;

import android.app.Service;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.os.BatteryManager;

import android.os.IBinder;

public class MonitorService extends Service {

@Override

public IBinder onBind(Intent intent) {

return null;

}

@Override

public void onStart(Intent intent, int startId) {

// 定義電池電量更新廣播的過濾器,只接受帶有ACTION_BATTERRY_CHANGED事件的Intent

IntentFilter batteryChangedReceiverFilter = new IntentFilter();

batteryChangedReceiverFilter.addAction(Intent.ACTION_BATTERY_CHANGED);

// 向系統(tǒng)注冊batteryChangedReceiver接收器,本接收器的實(shí)現(xiàn)見代碼字段處

registerReceiver(batteryChangedReceiver, batteryChangedReceiverFilter);

// 實(shí)例化Notification通知的管理器,即字段notification manager

notifyManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

// 由于初始化本服務(wù)時系統(tǒng)可能沒有發(fā)出ACTION_BATTERY_CHANGED廣播,那么剛才注冊的那個接收器將不會在本服務(wù)啟動時被激活,這種情況下就無法顯示當(dāng)前電量,因此在這里添加一個匿名廣播接收器。

new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

int level = intent.getIntExtra("level", 0);? //電池電量等級

int scale = intent.getIntExtra("scale", 100);? //電池滿時百分比

int status = intent.getIntExtra("status", 0);? //電池狀態(tài)

// 若正在充電

if (status == BatteryManager.BATTERY_STATUS_CHARGING)

notification = getNotification(getChargingIcon(level * 100 / scale),

"電池監(jiān)控", System.currentTimeMillis(), "電池電量", "正在充電");

else

notification = getNotification(getStateIcon(level * 100 / scale),

"電池監(jiān)控", System.currentTimeMillis(), "電池電量", "請及時充電");

//向系統(tǒng)發(fā)送此通知,為方便起見,通知ID簡單設(shè)為0

notifyManager.notify(0, notification);

}

};

}

@Override

public void onDestroy() {

//當(dāng)本服務(wù)終止時,通過通知ID注銷左上角的通知

notifyManager.cancel(0);

}

// --------------------------------------私有方法------------------------------

// 獲得一個notification

private Notification getNotification(int notificationIcon, String tickerText,

long when, String contentTitle, String contentText) {

// 定義該notification的擴(kuò)展文本和intent

Notification notification = new Notification(notificationIcon, tickerText,

when);

Context context = getApplicationContext();

Intent notificationIntent = new Intent(context, BatteryInfo.class);

PendingIntent contentIntent = PendingIntent.getActivity(this, 0,

notificationIntent, 0);

notification.setLatestEventInfo(context, contentTitle, contentText,

contentIntent);

// 設(shè)置本狀態(tài)出現(xiàn)在“正在進(jìn)行”而非“通知”欄目,不允許用戶清除狀態(tài)圖標(biāo)

notification.flags |= Notification.FLAG_ONGOING_EVENT;

return notification;

}

// 獲得對應(yīng)的電池狀態(tài)圖標(biāo)

private int getStateIcon(int batteryHealth) {

if (batteryHealth >= 0 || batteryHealth <= 100)

return batteryStateIcons[batteryHealth]; //這里是為了方便起見而硬編碼的資源數(shù)組,直接從R.java文件中提取的十六進(jìn)制資源ID

return R.drawable.stat_sys_battery_unknown;

}

// 獲得對應(yīng)的充電狀態(tài)圖標(biāo)

private int getChargingIcon(int batteryHealth) {

if (batteryHealth >= 0 && batteryHealth < 5)

return R.drawable.stat_sys_battery_charge_anim0;

if (batteryHealth >= 5 && batteryHealth < 10)

return R.drawable.stat_sys_battery_charge_anim01;

if (batteryHealth >= 10 && batteryHealth < 15)

return R.drawable.stat_sys_battery_charge_anim02;

if (batteryHealth >= 15 && batteryHealth < 20)

return R.drawable.stat_sys_battery_charge_anim03;

if (batteryHealth >= 20 && batteryHealth < 25)

return R.drawable.stat_sys_battery_charge_anim04;

if (batteryHealth >= 25 && batteryHealth < 30)

return R.drawable.stat_sys_battery_charge_anim05;

if (batteryHealth >= 30 && batteryHealth < 35)

return R.drawable.stat_sys_battery_charge_anim06;

if (batteryHealth >= 35 && batteryHealth < 40)

return R.drawable.stat_sys_battery_charge_anim07;

if (batteryHealth >= 40 && batteryHealth < 45)

return R.drawable.stat_sys_battery_charge_anim08;

if (batteryHealth >= 45 && batteryHealth < 50)

return R.drawable.stat_sys_battery_charge_anim09;

if (batteryHealth >= 50 && batteryHealth < 55)

return R.drawable.stat_sys_battery_charge_anim10;

if (batteryHealth >= 55 && batteryHealth < 60)

return R.drawable.stat_sys_battery_charge_anim11;

if (batteryHealth >= 60 && batteryHealth < 65)

return R.drawable.stat_sys_battery_charge_anim12;

if (batteryHealth >= 65 && batteryHealth < 70)

return R.drawable.stat_sys_battery_charge_anim13;

if (batteryHealth >= 70 && batteryHealth < 75)

return R.drawable.stat_sys_battery_charge_anim14;

if (batteryHealth >= 75 && batteryHealth < 80)

return R.drawable.stat_sys_battery_charge_anim15;

if (batteryHealth >= 80 && batteryHealth < 85)

return R.drawable.stat_sys_battery_charge_anim16;

if (batteryHealth >= 85 && batteryHealth < 90)

return R.drawable.stat_sys_battery_charge_anim17;

if (batteryHealth >= 90 && batteryHealth < 95)

return R.drawable.stat_sys_battery_charge_anim18;

if (batteryHealth >= 95 && batteryHealth < 100)

return R.drawable.stat_sys_battery_charge_anim19;

if (batteryHealth == 100)

return R.drawable.stat_sys_battery_charge_animfull;

return R.drawable.stat_sys_battery_unknown;

}

// -------------------------------私有字段--------------------------------------

private NotificationManager notifyManager = null;

private Notification notification = null;

//這里是為了方便起見而硬編碼的icon資源數(shù)組,直接從R.java文件中提取的十六進(jìn)制資源ID,本數(shù)組的0號元素0x7f020002表示資源stat_sys_battery_0.png(見附件),以后累加。不同配置的ID可能不同,請讀者自行修改。

private int batteryStateIcons[] = { 0x7f020002, 0x7f020003, 0x7f020004,

0x7f020005, 0x7f020006, 0x7f020007, 0x7f020008, 0x7f020009, 0x7f02000a,

0x7f02000b, 0x7f02000c, 0x7f02000d, 0x7f02000e, 0x7f02000f, 0x7f020010,

0x7f020011, 0x7f020012, 0x7f020013, 0x7f020014, 0x7f020015, 0x7f020016,

0x7f020017, 0x7f020018, 0x7f020019, 0x7f02001a, 0x7f02001b, 0x7f02001c,

0x7f02001d, 0x7f02001e, 0x7f02001f, 0x7f020020, 0x7f020021, 0x7f020022,

0x7f020023, 0x7f020024, 0x7f020025, 0x7f020026, 0x7f020027, 0x7f020028,

0x7f020029, 0x7f02002a, 0x7f02002b, 0x7f02002c, 0x7f02002d, 0x7f02002e,

0x7f02002f, 0x7f020030, 0x7f020031, 0x7f020032, 0x7f020033, 0x7f020034,

0x7f020035, 0x7f020036, 0x7f020037, 0x7f020038, 0x7f020039, 0x7f02003a,

0x7f02003b, 0x7f02003c, 0x7f02003d, 0x7f02003e, 0x7f02003f, 0x7f020040,

0x7f020041, 0x7f020042, 0x7f020043, 0x7f020044, 0x7f020045, 0x7f020046,

0x7f020047, 0x7f020048, 0x7f020049, 0x7f02004a, 0x7f02004b, 0x7f02004c,

0x7f02004d, 0x7f02004e, 0x7f02004f, 0x7f020050, 0x7f020051, 0x7f020052,

0x7f020053, 0x7f020054, 0x7f020055, 0x7f020056, 0x7f020057, 0x7f020058,

0x7f020059, 0x7f02005a, 0x7f02005b, 0x7f02005c, 0x7f02005d, 0x7f02005e,

0x7f02005f, 0x7f020060, 0x7f020061, 0x7f020062, 0x7f020063, 0x7f020064,

0x7f020065, 0x7f02007b };

// 接受電池信息更新的廣播

private BroadcastReceiver batteryChangedReceiver = new BroadcastReceiver() {

public void onReceive(Context context, Intent intent) {

int level = intent.getIntExtra("level", 0);

int scale = intent.getIntExtra("scale", 100);

int status = intent.getIntExtra("status", 0);

// 若正在充電

if (status == BatteryManager.BATTERY_STATUS_CHARGING)

notification = getNotification(getChargingIcon(level * 100 / scale),

"Battery Monitor", System.currentTimeMillis(), "電池電量", "正在充電");

else

notification = getNotification(getStateIcon(level * 100 / scale),

"Battery Monitor", System.currentTimeMillis(), "電池電量", "請及時充電");

notifyManager.notify(0, notification);

}

};

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容