Выполняйте задание и выполняйте пул каждые 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. Проверьте их здесь, адаптеры синхронизации. Они лучше для производительности батареи. Разрешить аутентификацию и добавить архитектуру плагинов к базе кода.