Фоновая служба останавливается в режиме экономии заряда батареи в Android R

#android #battery #background-service #battery-saver

#Android #батарея #фоновая служба #экономия заряда батареи

Вопрос:

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

мой класс обслуживания :

 public class BatService extends Service {

  private BatReceiver receiver = new BatReceiver();

  @Override
  public void onCreate() {
    super.onCreate();
  }

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {

    BatteryLevelAsync async = new BatteryLevelAsync();
    async.execute();

    return START_STICKY;
  }

  @Override
  public void onDestroy() {
    unregisterReceiver(receiver);

    super.onDestroy();
  }

  private class BatteryLevelAsync extends AsyncTask<Void,Void,Void>
  {
    @Override
    protected Void doInBackground(Void... voids) {
      registerReceiver(receiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
      return null;
    }
  }

  @Override
  public IBinder onBind(Intent intent) {
    return null;
  }
}
  

Ответ №1:

Google ввел ограничения на Android 8 для оптимизации заряда батареи. Это ограничивает фоновую работу даже при использовании служб. Я нашел решение для решения этой проблемы: используйте PowerManager.

Добавить разрешение на манифест :

 <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
  

И добавьте приведенный ниже код к своему действию :

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  String packageName = context.getPackageName();
  PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
  if (!pm.isIgnoringBatteryOptimizations(packageName)) {
    Intent intent = new Intent();
    intent.setAction(android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setData(Uri.parse("package:"   packageName));
    context.startActivity(intent);
  }
}
  

Ответ №2:

в Kotlin используется следующим образом:

  @SuppressLint("BatteryLife")
    fun permissionBattery() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            val packageName: String = baseContext.packageName
            val pm: PowerManager =
                baseContext.getSystemService(Context.POWER_SERVICE) as PowerManager
            if (!pm.isIgnoringBatteryOptimizations(packageName)) {
                val intent = Intent()
                intent.action = Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
                intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
                intent.data = Uri.parse("package:$packageName")
                baseContext.startActivity(intent)
            }
        }
    }
  

Кроме того, вам необходимо

 <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
  

затем пользователь может изменить настройки по умолчанию для отключения батареи