Служба Android не использует блокировку, полученную при выключении экрана. Как мне правильно использовать ее для фоновой службы

#java #android #service #android-service #wakelock

#java #Android #Обслуживание #android-сервис #wakelock

Вопрос:

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

У манифеста есть разрешение

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

Служба запускается из фрагмента с логическим намерением дополнительно, чтобы указать, должна ли она получить блокировку пробуждения

 Intent intent = new Intent(mainActivity.getApplicationContext(), NetworkService.class);
intent.putExtra("Wake Lock", wakeLockBox.isEnabled());
mainActivity.startService(intent);
  

Мое создание сервиса получает wakelock с частичным тегом.

     private PowerManager mPowerManager;
    private PowerManager.WakeLock wakeLock;
    private boolean wakeLockSet;

    // service doing its thing code here

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("Service", "Started");
        wakeLockSet = intent.getBooleanExtra("Wake Lock", false);
        // ...
        setWakeLock();
        // ...
        return START_STICKY;
    }


   private void setWakeLock()
   {
        mPowerManager = (PowerManager) getSystemService(getApplicationContext().POWER_SERVICE);
        wakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                "NetworkService::WakelockTag");
        wakeLock.acquire();
   }
  

Основываясь на том, что я видел в предыдущих постах и в результате тестирования, единственный способ освободить wakelock — это уничтожить Службу.

     @Override
    public void onDestroy()
    {
        // ...
        if (wakeLockSet) wakeLock.release();
        Log.d("Service", "Shutdown");
        stopSelf();
    }
  

Всякий раз, когда мой экран выключается, вызывается метод service onDestroy(), и служба снимает блокировку, сама останавливается. Поэтому я в замешательстве по поводу того, как wakelock работает со службами, которые должны запускаться при выключенном экране.

Я пробовал сервисы переднего плана:

в фрагменте

 // notification builder made earlier

Intent intent = new Intent(mainActivity.getApplicationContext(), NetworkService.class);
intent.putExtra("Notification", builder.build());
intent.putExtra("Wake Lock", wakeLockBox.isEnabled());
mainActivity.startForegroundService(intent);
  

затем создание службы

     private PowerManager mPowerManager;
    private PowerManager.WakeLock wakeLock;
    private boolean wakeLockSet;

    // service doing its thing code here

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        startForeground(400, intent.getExtras().getParcelable("Notification"));
        Log.d("Service", "Started");
        wakeLockSet = intent.getBooleanExtra("Wake Lock", false);
        // ...
        setWakeLock();
        // ...
        return START_STICKY;
    }


   private void setWakeLock()
   {
        mPowerManager = (PowerManager) getSystemService(getApplicationContext().POWER_SERVICE);
        wakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                "NetworkService::WakelockTag");
        wakeLock.acquire();
   }
  

Хотя результаты те же. Открыт для любых идей и готов поделиться дополнительной информацией, если это необходимо.