Страницы

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

вторник, 31 декабря 2019 г.

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

#java #android #android_service #android_alarm_manager


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

Было бы здорово, если бы кто-то привел пример реализации запуска метода с периодичностью
в 10 минут.
    


Ответы

Ответ 1



Вам не нужен в данном случае сервис. Вам нужен 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()); } } Манифест:

Ответ 2



С той ж целью можно использовать Timer: import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import java.util.Timer; import java.util.TimerTask; public class MyActivity extends AppCompatActivity { Timer mTimer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); mTimer = new Timer(); startAlarm(); } private void startAlarm() { mTimer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { //Тут отработка метода в отдельном потоке; runOnUiThread(new Runnable() { @Override public void run() { //Тут выход в UI если нужно; } }); } } , 0 // Это задержка старта, сейчас 0; , 600000); // Это Ваш период в 10 минут; } private void cancelTimer() { if (mTimer != null) { mTimer.cancel(); mTimer = null; } } }

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

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