Запуск службы Android каждые 20 секунд с использованием AlarmManager не перезапускается при уничтожении приложения из списка приложений.

Я пытаюсь запустить службу Android, которая запускается в фоновом режиме каждые 20 секунд и отправляет данные пользователя на сервер для отслеживания. Он работает в первый раз, когда я запускаю свое приложение. Теперь, если я нажму кнопку «Домой», она все равно будет работать в фоновом режиме. Но теперь, если я убью свое приложение из списка приложений с помощью кнопки «Домой». И перезапустите мое приложение с помощью значка запуска. Теперь служба не запускается. Я использую Alarm Manager для запуска службы каждые 20 секунд. Но при перезагрузке мой будильник установлен, но не регистрируется на широковещательном приемнике, в результате моя служба не вызывается. Ниже приведен мой код: - MyFragment.java onCreateView(), где я устанавливаю свой будильник: -

Intent alarm = new Intent(mContext, AlarmReceiver.class);
    boolean alarmRunning = (PendingIntent.getBroadcast(mContext, 0, alarm, PendingIntent.FLAG_NO_CREATE) != null);
    if (alarmRunning == false) {
        Log.e("In OnCreateView DDFrag", "AlarmRunning == False");
        PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, alarm, 0);
        AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
        alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 20000, pendingIntent);
    } else{
        Log.e("In OnCreateView DDFrag", "AlarmRunning == True");
    }

AlarmReceiver.class:-

    public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent background = new Intent(context, MyService.class);
        Log.e("AlarmReceiver", "Broadcasr Receiver started");
        context.startService(background);
    }
}

MyService.class :-

    public class MyService extends Service {

    public boolean isServiceRunning;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        this.isServiceRunning = false;
    }



    @Override
    public void onDestroy() {
        this.isServiceRunning = false;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if(!this.isServiceRunning) {
            sendDataToServer();
            this.isServiceRunning = true;
        }
        return START_STICKY;
    }


    private void sendDataToServer() {
        // Performing my operation in this method..
    // On Success of the method performed I am calling the below method and setting the below variables:
    stopSelf();
        this.isServiceRunning = false;
    }
}

Также я определяю свою службу и получателя в файле manifest.xml как: -

<service android:name="com.mypackagename.services.MyService" />

    <receiver android:name="com.mypackagename.services.AlarmReceiver" />

Пожалуйста, помогите мне решить проблему или укажите, что я делаю неправильно. Как в первый раз. поскольку мой менеджер тревог не установлен, он устанавливается, и служба вызывается через 20 секунд соответственно. Но если я убью свое приложение и запущу его снова, то мой будильник будет установлен так, что он не запустится и не установится снова. и теперь мой класс AlarmReceiver никогда не получает Alarm BroadcastReceiver.


person Pravinsingh Waghela    schedule 09.09.2017    source источник
comment
На каком устройстве вы тестируете?   -  person David Wasser    schedule 14.09.2017
comment
@DavidWasser Я тестирую слот Lenovo A6010.   -  person Pravinsingh Waghela    schedule 14.09.2017
comment
Вы добавили свое приложение в список защищенных приложений или в список приложений, которым разрешено работать в фоновом режиме? На Lenovo должно быть что-то вроде Настройки->Питание->Управление фоновыми приложениями. Пожалуйста, попробуйте найти это и добавить свое приложение в список. Дайте мне знать, что вы найдете.   -  person David Wasser    schedule 14.09.2017
comment
@DavidWasser Извините, но я не смог найти на своем устройстве такой опции, как Power или Background App Management.   -  person Pravinsingh Waghela    schedule 14.09.2017


Ответы (1)


Вот несколько вещей:

Пожалуйста, удалите код "alarmRunning", где вы устанавливаете будильники. Просто делайте это все время. Если будильник уже установлен, его повторная установка просто отменит старый и установит новый. Это не проблема.

Вы не можете полагаться на наличие PendingIntent, чтобы определить, установлен ли аварийный сигнал в диспетчере аварийных сигналов. Это, скорее всего, причина, по которой вы не получаете сигналов тревоги после закрытия и перезапуска вашего приложения.

Кроме того, вы не можете надежно запланировать будильник каждые 20 секунд, используя setRepeating(). Android имеет строгие правила управления питанием и не будет надежно запускать повторяющийся сигнал тревоги, который длится менее 2 минут на большинстве устройств. Вы можете увидеть, как этот будильник срабатывает через 2, 3 или 5 минут вместо 20 секунд, в зависимости от настроек управления питанием, уровня заряда батареи, занятости устройства, того, находится ли оно в спящем режиме и т. д.

Если вы действительно хотите, чтобы что-то запускалось каждые 20 секунд, вам следует установить один будильник, а когда этот будильник сработает, обработать его и установить следующий будильник через 20 секунд.

person David Wasser    schedule 14.09.2017
comment
Спасибо, Давид, твой совет действительно помог мне. Большое спасибо. - person Pravinsingh Waghela; 14.09.2017
comment
Рад, что смог помочь. - person David Wasser; 14.09.2017