Android:在特定电池级别启动服务

时间:2014-06-17 10:27:31

标签: android broadcastreceiver batterylevel

如果电池电量在充电时达到一定值,我想启动一个IntentService。

但是,我不想在BroadcastReceiver中为android.intent.action.BATTERY_CHANGED注册AndroidManifest.xml,因为我只需要在某个级别(例如40%)启动该服务,并且只在充电时。

另一个想法是启动一个只要手机充电就能运行的服务并以编程方式注册接收器。 第三个想法是定期使用AlarmManager启动服务并检查电池电量。

最好的方法是什么?

解决方案:
我从下面的答案中实现了第四个想法。

final int PI_REQUEST_CODE = 123456;
int pref_BatteryUpdatePeriod = 120000;  // 2 minutes

// set repeating alarm manager
Intent monitorIntent = new Intent(this, CheckBatteryReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), PI_REQUEST_CODE, monitorIntent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, Calendar.getInstance().get(Calendar.MILLISECOND), pref_BatteryUpdatePeriod, pendingIntent);

和警报的广播接收器:

public class CheckBatteryReceiver extends BroadcastReceiver {

private int targetBatterylevel = 40;

@Override
public void onReceive(Context context, Intent intent) {

    // get sticky intent
    Intent batteryStatusIntent = context.getApplicationContext()
            .registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
    int batteryLevel = batteryStatusIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 50);

    // evaluate battery level
    if(batteryLevel >= targetBatterylevel){
        // start service to stop charging
    } else {
        // continue charging
    }       
}
}

注意:我必须使用context.getApplicationContext()而不是context否则应用程序会崩溃,但我无法在广播接收器中注册接收器

3 个答案:

答案 0 :(得分:2)

  

我不想在AndroidManifest.xml中为android.intent.action.BATTERY_CHANGED注册一个BroadcastReceiver,因为我只需要在某个级别(例如40%)启动该服务,并且只在充电时。

无论如何这都行不通,因为你无法在清单中注册该广播。

  

另一个想法是启动一个只要手机充电就能运行的服务并以编程方式注册接收器。

呸。

  

第三个想法是定期使用AlarmManager启动服务并检查电池电量。

第四个想法是按照您的建议使用AlarmManager,但在开始时绕过服务。只需让AlarmManager调用BroadcastReceiver即可。它可以通过调用context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED))context传入onReceive())来检查电池电量。 Intent返回的registerReceiver()将是ACTION_BATTERY_CHANGED的最后一次广播。如果电池电量等于或低于所需阈值,请启动IntentService。如果您的闹钟会唤醒设备,则可能需要采用WakefulBroadcastReceiverWakefulIntentService模式。还允许用户选择轮询周期,这样他们就可以折衷精度以获得更好的设备性能。

我会选择第四个想法。

答案 1 :(得分:0)

让服务运行并不是一件坏事,只要在你不需要的时候没有做任何事情就会对android.intent.action.BATTERY_CHANGED作出反应。也就是说,要及早检查有趣的电池电量和充电状态,如果你无事可做就退出。

如果您想使事情变得复杂,请注册一个迷你服务,该服务只有在条件合适时才能启动主服务。但是,我看不出会有什么好处。

答案 2 :(得分:0)

public class Main extends Activity {
  private TextView batteryTxt;
  private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver(){
    @Override
    public void onReceive(Context ctxt, Intent intent) {
      int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
      batteryTxt.setText(String.valueOf(level) + "%");


    }
  };

  @Override
  public void onCreate(Bundle b) {
    super.onCreate(b);
    setContentView(R.layout.main);
    contentTxt = (TextView) this.findViewById(R.id.batteryTxt);
    this.registerReceiver(this.mBatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
  }
}