Запустите фоновый код, когда зарядное устройство подключится

1

Я пытаюсь запустить какой-то код каждый раз, когда зарядное устройство подключается к устройству и приложение закрывается. Единственное, что я обнаружил, - это запланировать работу, которая может выполняться только при подключенном зарядном устройстве, но проблема в том, что код будет выполняться только один раз (если я не перенесу его из), и он будет выполняться только на установленном устройстве. раз. Я хочу, чтобы код запускался немедленно и каждый раз, когда я подключаю зарядное устройство, как широковещательный слушатель, но в фоновом режиме.

Это возможно или у вас есть другие предложения?

Заранее спасибо! :)

РЕДАКТИРОВАТЬ: Кажется, что вы не можете больше слушать такие трансляции, если вы используете уровень API 26+ ref

Теги:
kotlin

3 ответа

2

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

  • 0
    Кажется, он возвращает только значение по умолчанию (-1) и не работает в фоновом режиме :(
  • 0
    Исправлена проблема со значением по умолчанию, но она все еще не работает в фоновом режиме :(
Показать ещё 1 комментарий
0

Вы можете использовать JobScheduler и использовать метод setRequiresCharging(boolean requiresCharging) в JobInfo.Builder вами JobInfo.Builder.

  • 0
    Да, но тогда я должен планировать это каждые 15 минут, верно? : /
  • 0
    Насколько я понимаю, ваша работа будет запущена, как только устройство перейдет на зарядку, если не прошло выделенное время (которое, я полагаю, происходит каждые 15 минут). Таким образом, вам не нужно будет опрашивать, но это будет означать, что если бы телефон не был заряжен в течение получаса, а затем перешел на зарядку, очень вероятно, что ваша работа будет выполнена ... однако, если вы затем перестал заряжаться и снова подзаряжался через минуту, вероятно, не будет. Я бы порекомендовал вам проверить это самостоятельно!
Показать ещё 1 комментарий
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 обновите время.

Ссылка на код

Ещё вопросы

Сообщество Overcoder
Наверх
Меню