【问题标题】:Android: Start Service at certain Battery LevelAndroid:在特定电池电量下启动服务
【发布时间】:2014-06-18 21:33:35
【问题描述】:

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

但是,我不想在AndroidManifest.xml 中为android.intent.action.BATTERY_CHANGED 注册BroadcastReceiver,因为我只需要在某个级别(例如 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 否则应用程序会崩溃,但我无法在广播接收器中注册接收器

【问题讨论】:

    标签: android broadcastreceiver batterylevel


    【解决方案1】:

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

    这无论如何都不起作用,因为您无法在清单中注册该广播。

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

    呸。

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

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

    我会选择第四个想法。

    【讨论】:

      【解决方案2】:

      让服务运行听起来还不错,只要在您不需要它时它不做任何事情,它就会对android.intent.action.BATTERY_CHANGED 做出反应。也就是说,尽早检查有趣的电池电量和充电状态,如果无事可做就退出。

      如果你想让事情复杂化,注册一个迷你服务,它只在条件合适时启动你的主服务。但是,我看不出这会有什么好处。

      【讨论】:

      • 是的,这也是个好主意,但我认为基于警报的检查是更好的方法;)此外,我不能确定服务不会被杀死......
      【解决方案3】:
      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));
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        相关资源
        最近更新 更多