Фоновая служба приостанавливает и запускает снова автоматически в OREO

Я создал фоновую службу для регистрации намерения SCREEN_ON и SCREEN_OFF поймать событие с помощью широковещательного приемника, но некоторое время по неизвестной причине моя служба не передает намерение моему основному приложению. Для тестирования я сгенерировал файл журнала, используя десятисекундный таймер, работает ли моя фоновая служба или нет, который я прикрепил ниже. У меня проблема из-за того, что моя фоновая служба приостанавливается на некоторое время и запускается автоматически.

Это моя фоновая служба

public class MyBackgroundService extends Service {

    BroadcastReceiver receiver;
    private static final String LOG_TAG = "MyBackgroundService";

    @Override
    public void onCreate() {
        super.onCreate();
        Timber.i("Foreground Service OnCreate");
    }

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

        Timber.i("Start Foreground Service");

        receiver = new ScreenStateReceiver();
        registerReceiver(receiver,  new IntentFilter(Intent.ACTION_SCREEN_ON));
        registerReceiver(receiver, new IntentFilter(Intent.ACTION_SCREEN_OFF));

        if (intent.getAction().equals(Constants.STARTFOREGROUND_ACTION)) {

            Intent notificationIntent = new Intent(this, HomeActivity.class);
           
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
                    notificationIntent, 0);

            Notification notification = new NotificationCompat.Builder(this)
                    .setContentTitle("text")
                    .setTicker("text")
                    .setContentText("text")
                    .setSmallIcon(R.drawable.logo_icon)
                    .setContentIntent(pendingIntent)
                    .setOngoing(true).build();

            startForeground(Constants.NOTIFICATION_ID.FOREGROUND_SERVICE,
                    notification);

        }
        startTimer();
        
        return START_STICKY;
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Timber.i("Foreground Service onUnbind");
        return super.onUnbind(intent);
    }

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        Timber.i("Foreground Service onTaskRemoved");
        super.onTaskRemoved(rootIntent);
    }

    @Override
    public void onDestroy() {
        stopForeground(true);
        Timber.i("Foreground Service onDestroy");
        stoptimertask();
        super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent intent) {
        // Used only in case of bound services.
        return null;
    }

    private Timer timer;
    private TimerTask timerTask;
    public void startTimer() {
        //set a new Timer
        timer = new Timer();

        //initialize the TimerTask's job
        initializeTimerTask();

        //schedule the timer, to wake up every 1 second
        timer.schedule(timerTask, 10000, 10000); //
    }

    /**
     * it sets the timer to print the counter every x seconds
     */
    public void initializeTimerTask() {
        timerTask = new TimerTask() {
            public void run() {
                Timber.i("Timer");
            }
        };
    }

    /**
     * not needed
     */
    public void stoptimertask() {
        //stop the timer, if it's not already null
        if (timer != null) {
            timer.cancel();
            timer = null;
        }
    }

}

Это мой радиоприемник

public class ScreenStateReceiver extends BroadcastReceiver {

    public ScreenStateReceiver(){
    }

    @Override
    public void onReceive(Context context, Intent intent) {

        String action = intent.getAction();
        if (action.equals(Intent.ACTION_SCREEN_OFF)){

            Timber.i("Screen OFF");
       }
        else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            Timber.i("Screen ON");
        }
    }
}

Menifest, объявление файла xml

<uses-permission android:name = "android.permission.WAKE_LOCK"/>
    
    <service android:name = ".service.MyBackgroundService"/>
    
    <receiver android:name = ".receiver.ScreenStateReceiver" android:enabled = "true" android:exported = "true">
        <intent-filter >
            <action android:name = "android.intent.action.SCREEN_OFF" />
            <action android:name = "android.intent.action.SCREEN_ON" />
        </intent-filter>
    </receiver>

Я запускаю службу с намерением

Intent service = new Intent(getContext().getApplicationContext(), MyBackgroundService.class);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

    service.setAction(Constants.STARTFOREGROUND_ACTION);
    getContext().getApplicationContext().startForegroundService(service);
}
else{

    service.setAction(Constants.MAIN_ACTION);
    getContext().getApplicationContext().startService(service);
}

Вот это изображение моего файла журнала ЖУРНАЛЬНЫЙ ФАЙЛ используя этот файл журнала, вы можете увидеть, что фоновая служба останавливается и запускается автоматически. пожалуйста, помогите мне решить эту проблему.

Вот ссылка на аналогичный случай, в котором есть некоторая информация, которая может быть полезна stackoverflow.com/questions/52425222/…

Umar Qureshi 12.12.2018 12:33

Также попробуйте проверить эту ссылку, которая показывает, как добиться аналогичного fabcirablog.weebly.com/blog/…

Umar Qureshi 12.12.2018 12:34

@UmarQureshi Я уже пробовал эту ссылку, которую вы дали мне во втором комментарии. У него такая же проблема.

user8919158 12.12.2018 13:02

@UmarQureshi Я реализовал обе ваши ссылки, но они не работают.

user8919158 12.12.2018 14:41

Та же проблема :(

AlexS 25.12.2018 14:13

@AlexS В чем твоя проблема ???

user3513759 15.03.2019 18:36

нужны запросы функций для фоновой службы, чтобы получить это

tgkprog 25.04.2019 08:52
1
7
1 785
1

Ответы 1

В Oreo есть ограничение для службы. Мы можем запустить службу, вызвав startService (), только когда приложение находится на переднем плане. Когда вы выходите из приложения (приложение находится в фоновом режиме), у него есть окно на несколько минут, в котором приложение может запустить службу. В конце окна приложение считается бездействующим, и тогда система останавливает фоновую службу. Чтобы запустить службу даже в фоновом режиме, мы должны либо реализовать службу переднего плана, либо использовать планировщик заданий и т. д.

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