2013-09-24 75 views
1

因此,对于我的应用程序,我想监视电池电量,即使在我的应用程序关闭时,然后在电池电量低于一定百分比时发送通知。我已经知道如何创建像this这样的后台服务,但我不确定如何使用其监控电池电量。我会在Manifest文件中注册一个BroadcastReceiver,还是应该动态地执行它?另外,我担心BroadcastReceiver在接收到第一次更新后会被OS终止。如何在Android上监控背景中的电池电量?

+0

http://stackoverflow.com/questions/24532934/checking-battery-level-in-the-background-with- a-service 请参阅行走食品解决方案 – Kriptite

回答

6

你必须动态注册它。

在服务中这样做可能是一个不错的选择。这是我用过:

this.registerReceiver(this.mBatInfoReceiver, 
        new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 

...

private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver(){ 
    @Override 
    public void onReceive(Context arg0, Intent intent) { 
     // TODO Auto-generated method stub 
     //this will give you battery current status 

    try{ 
     int level = intent.getIntExtra("level", 0); 
     int temp = intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, -1); 
     int voltage = intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1); 
     int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); 

     String BStatus = "No Data"; 
     if (status == BatteryManager.BATTERY_STATUS_CHARGING){BStatus = "Charging";} 
     if (status == BatteryManager.BATTERY_STATUS_DISCHARGING){BStatus = "Discharging";} 
     if (status == BatteryManager.BATTERY_STATUS_FULL){BStatus = "Full";} 
     if (status == BatteryManager.BATTERY_STATUS_NOT_CHARGING){BStatus = "Not Charging";} 
     if (status == BatteryManager.BATTERY_STATUS_UNKNOWN){BStatus = "Unknown";} 

     int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); 
     String BattPowerSource = "No Data"; 
     if (chargePlug == BatteryManager.BATTERY_PLUGGED_AC){BattPowerSource = "AC";} 
     if (chargePlug == BatteryManager.BATTERY_PLUGGED_USB){BattPowerSource = "USB";} 

     String BattLevel = String.valueOf(level); 

     int BHealth = intent.getIntExtra(BatteryManager.EXTRA_HEALTH, -1); 
     String BatteryHealth = "No Data"; 
     if (BHealth == BatteryManager.BATTERY_HEALTH_COLD){BatteryHealth = "Cold";} 
     if (BHealth == BatteryManager.BATTERY_HEALTH_DEAD){BatteryHealth = "Dead";} 
     if (BHealth == BatteryManager.BATTERY_HEALTH_GOOD){BatteryHealth = "Good";} 
     if (BHealth == BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE){BatteryHealth = "Over-Voltage";} 
     if (BHealth == BatteryManager.BATTERY_HEALTH_OVERHEAT){BatteryHealth = "Overheat";} 
     if (BHealth == BatteryManager.BATTERY_HEALTH_UNKNOWN){BatteryHealth = "Unknown";} 
     if (BHealth == BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE){BatteryHealth = "Unspecified Failure";} 

     //Do whatever with the data here 


    } catch (Exception e){ 
     Log.v(TAG, "Battery Info Error"); 
    } 
    } 
    }; 
+1

您是否知道为什么我必须动态地做它? –

+0

http://developer.android.com/reference/android/os/BatteryManager.html - “您无法通过在manifest中声明的组件接收此消息,只能通过使用Context.registerReceiver()显式注册它。请参阅ACTION_BATTERY_LOW ,ACTION_BATTERY_OKAY,ACTION_POWER_CONNECTED和ACTION_POWER_DISCONNECTED为不同的电池相关的广播发送,并可以通过清单接收器接收。“ –

+1

此代码只运行一次,当我启动应用程序....我需要它继续运行...如何要做到这一点? – Aradhna