Выполняйте задание и выполняйте пул каждые 2 минуты, независимо от того, закрыто приложение или удалено из памяти

Я использую android-priority-job-queue 'com.github.yigit:android-priority-jobqueue'. Чтобы убедиться, что он работает каждые 2 минуты. Ниже приведен код

public PoolingJob () {

    // This job requires network connectivity,
    // and should be persisted in case the application exits before job is completed.
    super (new Params (PRIORITY).requireNetwork ().groupBy (Const.POOLING_QUEUE_GROUP)
            .delayInMs (120000).persist ());//120 sec delay
}

Но оно приостанавливается всякий раз, когда приложение закрывается или удаляется из памяти. Как заставить работу работать непрерывно и делать пулы каждые 2 минуты, когда приложение закрыто или удалено из памяти. Есть ли что-то вроде липкого сервиса или android.permission.BIND_JOB_SERVICE?

Построение системы пула серверов. Требовать API 15 выше.

3 ответа

Вы можете использовать AlarmManager для отправки Intentс заданным интервалом и запустить работу в BroadcastReceiver независимо от того, работает приложение или нет.

При этом две минуты - это очень короткий интервал, и вам следует избегать выполнения каких-либо задач (особенно связанных с сетью) так часто. Это значительно увеличит разрядку аккумулятора.

Используя AlarmManager а также Service Вы можете достичь этого. Прочитайте документацию здесь AlarmManager.

Вот кодовый блок для установки и удаления будильника для повторяющихся задач

Установить будильник

public void createAlarm() {
        ServerDetails serverDetails = new ServerDetails(this);
        if (serverDetails.isSettingsOK()) {
            Intent i = new Intent(this, MyService.class);
            if (PendingIntent.getService(this, 0, i,
                    PendingIntent.FLAG_NO_CREATE) == null) {
                PendingIntent pendingIntent = PendingIntent.getService(this, 0,
                        i, PendingIntent.FLAG_CANCEL_CURRENT);
                AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
                int interval = 2 * 60 * 1000;
                alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                        System.currentTimeMillis() + interval, interval,
                        pendingIntent);
                Log.d("alarm", "alarm set successfully " + interval);
            } else {
                Log.d("alarm", "alarm already set");
            }

        }

    }

Отменить будильник

public void cancelAlarm() {
    Intent i = new Intent(this, MyService.class);
    PendingIntent pendingIntent = PendingIntent.getService(this, 0, i,
            PendingIntent.FLAG_NO_CREATE);
    if (pendingIntent != null) {
        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarmManager.cancel(pendingIntent);
        pendingIntent.cancel();
        Log.d("alarm", "alarm cancelled");
    }
}

Это сервис, который будет работать в фоновом режиме при активации тревоги.

public class MyService extends Service {

    @Override
    public IBinder onBind(Intent intent) {

        return null;
    }

    @Override
    public void onCreate() {

        super.onCreate();
        Log.d("service Created", "service created");

    }


    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
       doYourTaskHere();
    }

    private void doYourTaskHere() {

        // call here webservice or any other task here which you want to do in every two minutes

    }


}

Почему вы хотите, чтобы на вашем месте я бы вместо этого посмотрел SyncAdapters. Вы можете настроить их на работу даже в фоновом режиме, и это лучше с точки зрения архитектуры, чем обработка AlarmManager. Проверьте их здесь, адаптеры синхронизации. Они лучше для производительности батареи. Разрешить аутентификацию и добавить архитектуру плагинов к базе кода.

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