Страницы

Поиск по вопросам

вторник, 25 декабря 2018 г.

Как реализовать циклический вызов метода раз в 10 минут?

Вопрос относительно Service: пытаюсь реализовать процесс, который должен запускаться раз в 10 минут. Создал для этого отдельный метод. Прописал Cлужбу в AndroidManifest.xml, создал отдельный класс для Service. На данный момент Cлужба выполняется при запуске приложения и продолжает работать после завершения работы приложения. Но сейчас этот процесс запускается единожды. Метод выполняется в отдельном Thread'e в onStartCommand(). То есть сама Cлужба работает как надо, но вот выполнение метода нужно поставить в бесконечный цикл (с периодичностью 10 минут) до тех пор, пока в приложении пользователь не остановит Cлужбу
Было бы здорово, если бы кто-то привел пример реализации запуска метода с периодичностью в 10 минут.


Ответ

Вам не нужен в данном случае сервис. Вам нужен AlarmManager
public static void setAlarm(Context ctx) { AlarmManager am = (AlarmManager) ctx.getApplicationContext().getSystemService(Context.ALARM_SERVICE); Intent intentToTimerReceiver = new Intent(ctx.getApplicationContext(), ReceiverTimer.class); intentToTimerReceiver.setAction("someAction");
PendingIntent pendingIntent = PendingIntent.getBroadcast( ctx.getApplicationContext(), 0, intentToTimerReceiver, PendingIntent.FLAG_CANCEL_CURRENT);
int period10Minutes = 10; long periodInMiliseconds = periodInMinutes * 60 * 1000; if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { am.setInexactRepeating(AlarmManager.RTC_WAKEUP, periodInMiliseconds, periodInMiliseconds, pendingIntent); } else { am.setRepeating(AlarmManager.RTC_WAKEUP, periodInMiliseconds, periodInMiliseconds, pendingIntent); } }
private static void cancelAlarm(Context ctx) { Log.i(TAG, "cancelAlarm"); AlarmManager am = (AlarmManager) ctx.getApplicationContext().getSystemService(Context.ALARM_SERVICE); Intent intentToTimerReceiver = new Intent(ctx.getApplicationContext(), ReceiverTimer.class); intentToTimerReceiver.setAction("someAction"); PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx.getApplicationContext(), 0, intentToTimerReceiver, PendingIntent.FLAG_CANCEL_CURRENT);
am.cancel(pendingIntent); pendingIntent.cancel(); }
После его установки будет вызван описанный в ресивере и в отдельном классе ReceiverTimer, в коем вам и надо выполнять ваш периодический код
Ресивер:
public class ReceiverTimer extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.d(LOG, "onReceive " + intent.getAction()); } }
Манифест:



Комментариев нет:

Отправить комментарий