#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();
}
Хотя результаты те же. Открыт для любых идей и готов поделиться дополнительной информацией, если это необходимо.