Вопрос относительно 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());
}
}
Манифест:
Комментариев нет:
Отправить комментарий