2016-06-29 3 views
6

Ich habe eine App, die einen Code benötigt, um jede Minute ausgeführt werden. Aber das Problem ist, dass der Code bei jeder Minute Änderung der Uhr ausgeführt werden muss. Das heißt,geplant Alarm zu jeder Minute der Uhr android

Wenn es 12:34 ist, dann wird der Code um 12:35 ausgeführt und geht weiter. Aber mein aktueller Code funktioniert, aber es enthält die Sekunden. Bedeutung,

Wenn 12:34:30 und der Alarm beginnt, wird der Code ausgeführt. Aber der Code wird dann um 12:35:30 Uhr ausgeführt.

Ich möchte den Code jede Minute entsprechend der Uhr des Telefons ausgeführt werden. Unten ist der aktuelle Code.

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

Ich mache es jede Sekunde ausführen, so dass der Effekt zur exakten Zeit stattfindet. Statt es mit jeder Sekunde muß ich es selbst von der Uhr bei jeder kleinen Änderung wiederholen (jede Minute)

Wie gehe ich über diesen

+2

Wenn Sie nur diese benötigen, während die App läuft, und der Bildschirm ist auf schreiben, Verwenden Sie In-Process-Lösungen wie 'ScheduledExecutorService'. Wenn Sie möchten, dass dies funktioniert, auch wenn der Prozess Ihrer App beendet wurde oder der Bildschirm nicht aktiv ist, geben Sie auf und schreiben Sie eine andere App, da Android Ihr Szenario unter Android 6.0+ nicht unterstützt. – CommonsWare

Antwort

3

einen Kalender Nutzen Sie die Zeit, um auf den nächsten vollen auslösen Minute, und wiederholen sie es jede Minute (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

Also wird es in dem Moment ausgeführt werden, in dem diese setRepeating aufgerufen wird? Wie wenn der Alarm um 11:23 Uhr eingestellt ist, wird er auch um 11:23 Uhr ausgeführt oder nur um 11:24 Uhr – AxeManTOBO

+0

ausgeführt. Auf diese Weise wird er bei der nächsten vollen Minute ausgelöst, also 11.24 –

+0

Wenn Sie starten möchten um 11.23 setzen Sie calendar.minute auf 0 statt auf 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); 

Hoffnung dieser Code Ihr Problem

10

Verwendung gelöst Intent.ACTION_TIME_TICK Dies ist eine Sendung i Jede Minute hat das Android-Betriebssystem ausgelöst. Registrieren, um es, wie Sie zu einem normalen System übertragen in Code registrieren würde (funktioniert nicht von manifest)

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 Artikel beschreibt den kompletten Prozess.

+0

funktioniert diese Lösung auch wenn das Gerät im Schlafmodus ist? – cpalosrejano

-1

Sie unter Code für Ihre Anforderung verwenden können,

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

Danke für das Wiederholen meiner Antwort –

-1

können Sie Intent.ACTION_TIME_TICK verwenden.

Broadcast-Aktion: Die aktuelle Uhrzeit hat sich geändert. Wird jede Minute gesendet. Sie können dies nicht über Komponenten empfangen, die in Manifesten deklariert sind, nur indem Sie explizit mit Context.registerReceiver() registrieren.

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

Dies wurde bereits einen Tag früher beantwortet –

+0

mein Fehler @TimCastelijns – 100rabh

0

Verwenden Sie die Quartz Schedular API, machen den Mais Auftrag, der bei jedem min laufen.

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

die Schedular Bauen und auslösen, wie die

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

und Ihren Code in HelloJob Klasse

public class HelloJob implements Job { 

    public void execute(JobExecutionContext context) 
    throws JobExecutionException; 

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