2016-06-29 11 views
6

Mam aplikację, która wymaga kodu do wykonania co minutę. Problem polega jednak na tym, że kod musi być wykonywany przy każdej minucie zmiany zegara. Co oznacza, że ​​jeśli jest 12:34, kod zostanie wykonany o godzinie 12.35 i będzie kontynuowany. Ale mój obecny kod działa, ale zawiera sekundy. Znaczenie:zaplanowany alarm powtarzający się co minutę zegara Android

Jeśli zostanie uruchomiony kod 12:34:30 i alarm, kod zostanie wykonany. Ale kod jest następnie wykonywany o 12:35:30.

Chcę, aby kod wykonywany był co minutę zgodnie z zegarem telefonu. Poniżej znajduje się aktualny kod.

Intent intent2 = new Intent(MainActivity.this, MyABService.class); 
       PendingIntent pintent = PendingIntent.getService(MainActivity.this, 0, intent2, 0); 
       AlarmManager alarm_manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
       alarm_manager.setRepeating(AlarmManager.RTC, c.getTimeInMillis(), 1 * 1000, pintent); 

Im robię to co sekundę, aby efekt miał miejsce dokładnie w tym samym czasie. Zamiast go co drugi muszę go powtarzać przy każdej zmianie minut zegara (co minutę)

Jak mogę iść o tym

+2

Jeśli tylko trzeba to w czasie, gdy aplikacja jest uruchomiona, a ekran jest włączony, używać rozwiązań wewnątrzprocesowych, takich jak 'ScheduledExecutorService'. Jeśli szukasz tego do działania, nawet jeśli proces Twojej aplikacji został przerwany lub ekran nie jest włączony, zrezygnuj i napisz inną aplikację, ponieważ Android nie obsługuje Twojego scenariusza w systemie Android 6.0+. – CommonsWare

Odpowiedz

3

Użyj kalendarz, aby ustawić czas, aby wywołać na następny pełny minut i powtórz to co minutę (60 * 1000ms)

Calendar calendar = Calendar.getInstance(); 
calendar.setTimeInMillis(System.currentTimeMillis()); 
calendar.add(Calendar.MINUTE, 1); 
calendar.set(Calendar.SECOND, 0); 

long triggerAt = calendar.getTimeInMillis(); 
long repeatAfter = 60 * 1000; 

alarm_manager.setRepeating(AlarmManager.RTC, triggerAt, repeatAfter, pintent); 
+0

Czy zostanie on wykonany zaraz po wywołaniu setRepeating? Np. Jeśli alarm jest ustawiony na 11:23, to również zostanie wykonany o 11:23 lub zostanie wykonany tylko o 11:24 – AxeManTOBO

+0

W ten sposób zostanie wyzwolony w następnej pełnej minucie, więc 11.24 –

+0

Jeśli chcesz zacząć o 11.23 ustawiłeś calendar.minute na 0 zamiast add 1 –

0
Calendar calendar = Calendar.getInstance(); 
Intent intent = new Intent(context, AnyClass.class); 
      PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0); 
      AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
      alarm.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 60*1000, pendingIntent); 

Nadzieja kod ten rozwiązano problemu

10

Zastosowanie Intent.ACTION_TIME_TICK to ja broadcast ntent wystrzeliwany co minutę przez system operacyjny Android. Zarejestruj się nim jak można zarejestrować do normalnego sygnału telewizyjnego w kodzie (nie działa z manifestu)

tickReceiver=new BroadcastReceiver(){ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
    if(intent.getAction().compareTo(Intent.ACTION_TIME_TICK)==0) 
    { 
     //do something 
    } 
    }; 

    //Register the broadcast receiver to receive TIME_TICK 
    registerReceiver(tickReceiver, new IntentFilter(Intent.ACTION_TIME_TICK)); 

This artykuł opisuje cały proces.

+0

pracy tego rozwiązania, nawet jeśli urządzenie jest w trybie drzemki? – cpalosrejano

-1

Możesz skorzystać z poniższego kodu do Państwa wymagań,

Calendar initialCalendar = Calendar.getInstance(); 
    initialCalendar.setTimeInMillis(System.currentTimeMillis()); 
    initialCalendar.set(Calendar.SECOND, 0); 

    long triggerAtMillis = initialCalendar.getTimeInMillis(); 
    long intervalMillis = 60 * 1000; 

    alarm_manager.setRepeating(AlarmManager.RTC, triggerAtMillis, intervalMillis, pintent); 
+0

Dzięki za powtórzenie mojej odpowiedzi –

-1

Można użyć Intent.ACTION_TIME_TICK.

Działanie transmisji: Aktualny czas się zmienił. Wysyłane co minutę. Nie można tego uzyskać za pomocą składników zadeklarowanych w manifestach, tylko rejestrując się jawnie dla niego za pomocą Context.registerReceiver().

Źródło: https://developer.android.com/reference/android/content/Intent.html#ACTION_TIME_TICK

IntentFilter tickIntent = new IntentFilter(Intent.ACTION_TIME_TICK); 
private BroadcastReceiver receiver = new BroadcastReceiver(){ 
    @Override 
    public void onReceive(Context c, Intent i) { 
     // perform per minute task 
    } 
}; 
registerReceiver(receiver, tickIntent); 
+0

odpowiedź została już udzielona dzień wcześniej –

+0

mój błąd @TimCastelijns – 100rabh

0

Użyj API Quartz cedularne sprawiają, że praca z kukurydzy, które uruchomić na każdym min.

“0 0/1 * * * ?” // Corn expression run at every min 

Zbuduj cedularne i wyzwalać jak ten

 SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory(); 

    Scheduler sched = schedFact.getScheduler(); 

    sched.start(); 

    // define the job and tie it to our HelloJob class 
    JobDetail job = newJob(HelloJob.class) 
    .withIdentity("myJob", "group1") 
    .build(); 

    // Trigger the job to run now, and then every 1 min 
    Trigger trigger =trigger = newTrigger() 
    .withIdentity("trigger1", "group1") 
    .withSchedule(cronSchedule("0 0/1 * * * ?")) 
    .forJob("myJob", "group1") 
    .build(); 

    // Tell quartz to schedule the job using our trigger 
    sched.scheduleJob(job, trigger); 

i napisać kod w klasie HelloJob

public class HelloJob implements Job { 

    public void execute(JobExecutionContext context) 
    throws JobExecutionException; 

// Here you write your code which exceute on every min 
} 
Powiązane problemy