Есть ли обходной путь для запуска действия в ACTION_POWER_CONNECTED на Oreo? - PullRequest
1 голос
/ 24 июня 2019

В настоящее время я разрабатываю приложение для клиента, которое должно запускаться во время зарядки. Единственный способ, которым я знаю, это сделать с помощью манифеста следующим образом:

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

Но для Android Oreo эта опция больше не действительна и приводит к ошибке печати по типу «Фоновое выполнение не разрешено».

Кто-нибудь нашел хороший обходной путь для этой проблемы? По сути, мне нужен способ запуска действия, когда питание подключено, и оно должно оставаться открытым, пока питание не будет отключено. На телефоне не будут запущены никакие другие службы или действия, которые я мог бы использовать для создания явной трансляции.

1 Ответ

0 голосов
/ 28 июня 2019

Но для Android Oreo эта опция больше не действительна и вызывает ошибка при печати вдоль строк «Запрещено выполнение фона».

Из Oreo Пока приложение находится на переднем плане, оно может свободно создавать и запускать как передний, так и фоновый сервисы. Таким образом, 1 возможный подход может заключаться в создании службы переднего плана , которая отслеживает состояние зарядки / отсутствия зарядки с использованием класса BatteryManager - этот класс передает все сведения о батарее и зарядке в виде залипшего намерения, которое включает в себя состояние зарядки.

val ifilter = IntentFilter(Intent.ACTION_BATTERY_CHANGED)
val batteryStatus = context.registerReceiver(null, ifilter)

 val status = batteryStatus?.getIntExtra(BatteryManager.EXTRA_STATUS, -1)
 val isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL

Теперь, когда вы знаете, заряжается ваше устройство или нет.

Далее из того же кода класса обслуживания - в зависимости от состояния зарядки - вы можете запустить YourActivity, как показано ниже,

Intent i = new Intent();
i.setClass(this, YourActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);

Теперь запуск подобной активности может быть не самым лучшим опытом для пользователя - и, следовательно, вы можете рассмотреть возможность использования системы уведомлений Android для обновления / информирования пользователя о состоянии зарядки

...