ForgroundService зависит от режима сна
Мое приложение тревоги продолжает опаздывать, хотя я начинаю ForegroundService
от BroadcastReceiver
и onCreate()
из Service
Гехтс позвонил вовремя, но onStartCommand()
вызывается с задержкой (иногда), которая, как я полагаю, происходит из-за того, что телефон снова засыпает, прежде чем он сможет его выполнить
Как вы можете видеть из Log.d, служба запускается вовремя и вовремя вызывает PlayerActivity, но в этом случае она фактически запускается через 1:40 минут позже. Кроме того, Служба не выходит на передний план и не начинает потоковую передачу музыки до того, как истечет это случайное время задержки (окно обслуживания?)
Как мы должны держать устройство в активном состоянии достаточно долго, чтобы фактически запустить сервис переднего плана и вовремя войти в систему?
я использую setExactAndAllowWhileIdle()
вызвать AlarmReceiver - это прекрасно работает в 100% случаев. Задержка происходит после запуска сервиса.
Должен ли я запустить службу на 15 минут раньше, чтобы убедиться, что она вышла на передний план по фактическому времени будильника, и фактически начать потоковую передачу музыки и вызывать активность во время автоматического будильника?
BroadcastReceiver
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("Ben", "Alarmreceiver HELLO");
String label = context.getText(R.string.defaultLabel).toString();
int id = 1909;
Bundle extras = intent.getExtras();
if (extras != null) {
// kill running alarm activity
if (extras.containsKey("autoKill")) {
Log.d("Ben", "AlarmReceiver killing running alarm NOW.");
Intent bc = new Intent("PLAYER_STOP_SELF");
LocalBroadcastManager.getInstance(context).sendBroadcast(bc);
context.stopService(new Intent(context, StreamService.class));
return;
}
label = extras.getString("label");
id = extras.getInt("id");
}
Log.d("Ben", "AlarmReceiver ok!");
// CALC NEXT ALARM and start StreamingService...
if (Build.VERSION.SDK_INT >= 26) {
context.startForegroundService(new Intent(context, StreamService.class));
context.startForegroundService(new Intent(context, CalcNextAlarmService.class));
Log.d("Ben", "SDK >= 26 *** context.startForegroundServices");
}
else {
context.startService(new Intent(context, StreamService.class));
context.startService(new Intent(context, CalcNextAlarmService.class));
Log.d("Ben", "SDK < 26 *** context.startServices");
}
}
обслуживание
@Override
public void onCreate() {
// initializing variables, shared preferences,... not shown
Log.d("Ben", "StreamService calling PlayerActivity now...");
startActivity(new Intent(this, PlayerActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
// NOTI AND FOREGROUND!
Notification noti = createForegroundNotification();
startForeground(ntfctnId, noti);
// It doesn't even get to here before the delay...
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("Ben", "StreamService onStartCommand");
В соответствии с Log.d:
07-14 14:30:01.335 D/Ben: Alarmreceiver HELLO
07-14 14:30:01.364 D/Ben: AlarmReceiver ok! (label: Alarm 1 - id: 10001)
07-14 14:30:01.372 D/Ben: SDK < 26 *** context.startServices
07-14 14:30:01.378 D/Ben: StreamService calling PlayerActivity now...
07-14 14:31:41.116 D/Ben: StreamService onStartCommand
07-14 14:31:41.224 D/Ben: StreamService wakeLock.isHeld()
StreamService wifiLock.isHeld()
*** onStartCommand ELSE ***
07-14 14:31:41.227 D/Ben: preparing player - start streaming in 2 seconds...
07-14 14:31:41.365 D/Ben: wakeLock.isHeld()
wifiLock.isHeld()
07-14 14:31:41.366 D/Ben: PlayerActivity.onCreate()
07-14 14:31:43.229 D/Ben: Start Streaming now! (normal alarm)
07-14 14:31:43.241 D/Ben: buffering
07-14 14:31:43.242 D/Ben: buffering
07-14 14:31:44.345 D/Ben: ready
Тревога прекрасно работает в 95% использованного времени, но ИНОГДА эта дремота появляется и запускает тревогу с опозданием на 1-15 минут - я отлаживаю ее уже более 2 недель, переписываю весь сервис и классы Receiver 2 раза и начать сходить с ума, пожалуйста, помогите.
РЕДАКТИРОВАТЬ
Я закончил тем, что использовал бодрствующий BroadcastReceiver и бодрствующий сервис (для всех API < 26), который затем заботится о соответствующем вызове других сервисов (что я делал в AlarmReceiver раньше - и все еще делаю для API >= 26)
Пока что все работает нормально - только на одном из моих тестовых устройств с Lineage, где работает будильник, иногда срабатывает допоздна, на моем ежедневном телефоне я тоже работаю с Lineage, но там все нормально. Возможно, SGS 4 mini слишком стар (я не очень в это верю, но пока никто не жалуется, я должен предположить, что он работает так, как ожидалось)
Спасибо за вашу помощь @Elletlar.