2016-06-29 112 views
6

我有一個應用程序需要每分鐘執行一次代碼。但問題是代碼必須在每分鐘更改一次的時間內執行。也就是說,預定鬧鐘重複時鐘的每一分鐘android

如果它的12:34那麼代碼將在12:35執行並繼續。但我目前的代碼工作,但它包括秒。意思是,

如果它的12:34:30和報警開始,代碼被執行。但是代碼然後在12:35:30執行。

我希望根據手機的時鐘每分鐘執行一次代碼。以下是當前的代碼。

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

林使其每秒執行一次,這樣的效果在準確的時間發生。而不是它的每一秒我需要它重演在(每分鐘)

時鐘的每分鐘變化我如何去了解這個

+2

如果你只需要這個您的應用程序運行時,屏幕上,使用'ScheduledExecutorService'等進程內解決方案。如果你正在尋找這個工作,即使你的應用程序的進程被終止或屏幕沒有打開,放棄和寫一些其他的應用程序,因爲Android不支持Android 6.0 +的情況。 – CommonsWare

回答

3

使用日曆設置時間觸發到下一個全分鐘,重複每一分鐘(60和* 1000毫秒)

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

那麼這個setRepeating被調用的時候它會被執行嗎?就像如果鬧鐘設置在11:23那麼它也會在11:23執行,或者它只會在11:24執行 – AxeManTOBO

+0

這樣它會在下一個整分鐘觸發,所以11.24 –

+0

如果你想開始在11.23,您將calendar.minute設置爲0而不是添加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); 

希望這段代碼解決您的問題

10

使用Intent.ACTION_TIME_TICK這是一個廣播我Android操作系統每分鐘都會觸發一次。註冊它,你會註冊到一個正常的系統中的代碼廣播(不從工作清單)

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本文介紹的完整過程。

+0

工作這個解決方案,即使設備處於打盹模式? – cpalosrejano

-1

您可以使用下面的代碼爲您的要求,

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

感謝您的重複我的回答 –

-1

您可以使用Intent.ACTION_TIME_TICK。

廣播動作:當前時間已更改。每分鐘發送一次。您無法通過在manifest中聲明的組件接收此消息,只能通過Context.registerReceiver()明確註冊。

來源: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

這已經提前一天回答 –

+0

我的錯誤@TimCastelijns – 100rabh

0

使用石英程序器API,使得其在每分鐘運行玉米工作。

「0 0/1 * * * ?」 // Corn expression run at every min 

構建程序器和觸發像

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

,寫你的代碼HelloJob類

public class HelloJob implements Job { 

    public void execute(JobExecutionContext context) 
    throws JobExecutionException; 

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