0

我想监视电池电量,如果它达到一定的水平,我想做的事情。 我担心的是不必要地耗尽太多电池。正确优化的方式来监测android中的电池电量

使用服务将继续在后台运行。此外,如果我使用android.intent.action.BATTERY_CHANGED意图,它会检查电池级别的每一个变化。根据我的要求,这两种方法可能会消耗不必要的电池。

因此,如果我使用AlarmManager(它也是由OS处理的服务),它将检查每个用户定义的电池级别(适当的时间)。

以下是我已实施的代码。

import android.app.Activity; 
import android.app.AlarmManager; 
import android.app.PendingIntent; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 

public class MainActivity extends Activity { 

private AlarmManager mAlarmManager; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.fragment_main); 

     mAlarmManager= (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

     Intent intentAlarm = new Intent(this, AlarmReceiverTest.class); 

     // User defined time 
     long fiveMin= (AlarmManager.INTERVAL_FIFTEEN_MINUTES/3); // adjustment here 

     mAlarmManager.setRepeating(AlarmManager.RTC, 
        System.currentTimeMillis()+fiveMin, oneMin, 
        PendingIntent.getBroadcast(this,1, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT)); 

    } 

} 

广播接收机:

public class AlarmReceiverTest extends BroadcastReceiver { 

@Override 
public void onReceive(Context pContext, Intent arg1) { 

    IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
    Intent batteryStatus = pContext.registerReceiver(null, ifilter); 

    int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
    int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, 100); 
    int percent = (level*100)/scale; 

    if(percent== myThreshold) 
     //DO-SOMETHING 
} 

}

在清单:

<receiver android:name="AlarmReceiverTest"> 
    <intent-filter> 
     <action android:name="android.intent.action.BATTERY_CHANGED"/> 
    </intent-filter> 
</receiver> 

许可:

android.permission.BATTERY_STATS 

由于其重复报警,即使应用程序关闭,它也会继续检查。

例如:DO-SOMETHING:如果应用程序已经打开,可能会锁定应用程序如果应用程序已关闭,则不允许打开该应用程序。

这是正确的做法,并且我的理解是正确的吗? 请建议我是否有其他正确的方法。

编辑:

如果我要检查电池电量,每5-10小时间隔,这将是这样做的最好方法是什么?

+0

为什么人们downvote这个了什么? @Sats答案非常适合我需要的。 – hellaandrew 2016-03-16 05:27:52

回答

5

您不需要使用AlarmManager类。如果您使用AlarmManager类,则您的应用程序会消耗更多电量。

最简单的方法是使用intent ACTION_BATTERY_CHANGED的广播监听器。

public class AlarmReceiverTest extends BroadcastReceiver { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      int batteryLevel = intent.getIntExtra(
        BatteryManager.EXTRA_LEVEL, 0); 
      int maxLevel = intent 
        .getIntExtra(BatteryManager.EXTRA_SCALE, 0); 
      int batteryHealth = intent.getIntExtra(
        BatteryManager.EXTRA_HEALTH, 
        BatteryManager.BATTERY_HEALTH_UNKNOWN); 
      float batteryPercentage = ((float) batteryLevel/(float) maxLevel) * 100; 

      // Do something with batteryPercentage and batteryHealth. 
      // batteryPercentage here ranges 0-100 
     } 
    } 

onReceive在每次电池电量发生变化时都会运行。

在您的主要活动注册的广播接收器:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    AlarmReceiverTest mBatteryLevelReceiver = new AlarmReceiverTest(); 
    registerReceiver(mBatteryLevelReceiver, new IntentFilter(
      Intent.ACTION_BATTERY_CHANGED)); 
} 
+0

我也同意AlarmManager不是必需的 - ACTION_BATTERY_CHANGED不会非常频繁地调用。值得重申的是,按照http://developer.android.com/reference/android/content/Intent.html#ACTION_BATTERY_CHANGED,这个接收者必须在代码中注册,而不是在manifest中注册。 – Okas 2014-09-19 12:02:32

+0

因此,如果我没有取消注册这个广播,那么即使在应用程序关闭之后,它也会一直在更换电池上继续运行。 – OnePunchMan 2014-09-19 12:12:04

+0

是的,如果你想停止它,使用这个:@Override public void onDestroy(){ super.onDestroy(); unregisterReceiver(mBatteryLevelReceiver); } – Sats 2014-09-19 12:18:11