2016-06-29 20 views
6

Ho un'app che richiede l'esecuzione di un codice ogni minuto. Ma il problema è che il codice deve essere eseguito ad ogni minuto cambiamento dell'orologio. Il che significa,allarme programmato per ripetere ogni minuto dell'orologio android

Se è il 12:34, il codice verrà eseguito alle 12:35 e continuerà. Ma il mio codice attuale funziona ma include i secondi. Significato,

Se 12:34:30 e l'allarme si avvia, il codice viene eseguito. Ma il codice viene quindi eseguito alle 12:35:30.

Desidero che il codice venga eseguito ogni minuto in base all'orologio del telefono. Di seguito è riportato il codice corrente.

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 eseguendolo eseguito ogni secondo in modo che l'effetto abbia luogo nel momento esatto. Invece di avere ogni secondo ho bisogno di ripetersi ad ogni cambio minuti dell'orologio (ogni minuto)

Come posso fare per questo

+2

Se avete solo bisogno di questo mentre la vostra applicazione è in esecuzione e lo schermo è acceso, utilizzare soluzioni in-process come 'ScheduledExecutorService'. Se stai cercando di farlo funzionare anche se il processo della tua app è stato terminato o lo schermo non è attivo, rinunciare e scrivere qualche altra app, in quanto Android non supporta il tuo scenario su Android 6.0+. – CommonsWare

risposta

3

utilizzare un calendario per impostare il tempo di scattare alla prossima piena minuto, e ripetere ogni minuto (60 * 1000 ms)

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

Quindi verrà eseguito nel momento in cui viene chiamato il setRepeating? Come se l'allarme fosse impostato alle 11:23, verrà eseguito anche alle 11:23 o verrà eseguito solo alle 11:24 – AxeManTOBO

+0

In questo modo verrà attivato al prossimo minuto completo, quindi 11.24 –

+0

Se si desidera iniziare alle 11.23, si imposta calendar.minute su 0 invece di aggiungere 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); 

Spero che questo codice ha risolto il problema

10

Usa Intent.ACTION_TIME_TICK questa è una trasmissione i ntent licenziato ogni minuto dal sistema operativo Android. Registrati per come si farebbe registrati per un sistema normale trasmissione in codice (non funziona da manifesto)

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 articolo viene descritto il processo completo.

+0

funziona questa soluzione anche se il dispositivo è in modalità doze? – cpalosrejano

-1

È possibile utilizzare il codice di seguito per il vostro requisito,

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

Grazie per aver ripetuto la mia risposta –

-1

È possibile utilizzare Intent.ACTION_TIME_TICK.

Azione broadcast: l'ora corrente è cambiata. Inviato ogni minuto Non è possibile ricevere questo tramite componenti dichiarati nei manifest, solo registrandoli esplicitamente con Context.registerReceiver().

Fonte: 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

questa era già stata risposta il giorno prima –

+0

il mio errore @TimCastelijns – 100rabh

0

Utilizzare l'API quarzo cedolare, rendere il lavoro di mais che corrono in ogni min.

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

costruire lo Schedular e innescare così

 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); 

e scrivere il codice della classe HelloJob

public class HelloJob implements Job { 

    public void execute(JobExecutionContext context) 
    throws JobExecutionException; 

// Here you write your code which exceute on every min 
}