连接充电器后运行代码背景

时间:2019-04-16 09:53:21

标签: android kotlin

每次充电器连接到设备且应用程序关闭时,我都在尝试运行一些代码。我发现的唯一事情是安排了一个只能在连接充电器时才能运行的作业,但是问题是该代码只能运行一次(除非我重新安排了它的工作时间),并且它只能在集合中运行次。我希望代码能在每次连接充电器时立即运行,就像广播收听器一样,但要在后台运行。

这可能吗?或者您还有其他建议吗?

提前谢谢! :)

编辑: 如果您运行的是API级别26+ ref

,似乎您再也听不到这类广播了

3 个答案:

答案 0 :(得分:3)

每当设备连接或断开电源时,BatteryManager都会广播操作。即使在您的应用未运行时也要接收这些事件,这一点很重要-特别是因为这些事件会影响您启动应用以启动后台更新的频率-因此,您应该在清单中注册一个BroadcastReceiver以便通过以下方式监听这两个事件在意图过滤器中定义ACTION_POWER_CONNECTED和ACTION_POWER_DISCONNECTED。

<receiver android:name=".PowerConnectionReceiver">
  <intent-filter>
    <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
    <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
  </intent-filter>
</receiver>

在相关的BroadcastReceiver实现中,您可以按照上一步中的说明提取当前的计费状态和方法。

public class PowerConnectionReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
        boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                            status == BatteryManager.BATTERY_STATUS_FULL;

        int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
        boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
        boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
    }
}

参考:https://developer.android.com/training/monitoring-device-state/battery-monitoring

答案 1 :(得分:1)

您可以使用JobScheduler,并在创建的JobInfo.Builder上使用setRequiresCharging(boolean requiresCharging)方法。

答案 2 :(得分:0)

继续在后台运行线程并使用此方法

public static boolean isConnected(Context context) {
    Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
    int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
    return plugged == BatteryManager.BATTERY_PLUGGED_AC || plugged == BatteryManager.BATTERY_PLUGGED_USB;
}

如果isConnected()返回true,则更新时间。

Code reference