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.

0 ответов

Другие вопросы по тегам