简体   繁体   中英

scheduled alarm to repeat every minute of the clock android

I have an app which requires a code to be executed every minute. But the issue is that the code has to be executed at every minute change of the clock. Which means,

If its 12:34 then the code will execute at 12:35 and goes on. But my current code works but it includes the seconds. Meaning,

If its 12:34:30 and the alarm starts, the code is executed. But the code is then executed at 12:35:30.

I want the code to be executed each minute according to the clock of the phone. Below is the current 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);

Im making it execute every second so that the effect takes place at the exact time. Instead of having it every second i need it to repeat itself at every minute change of the clock (every minute)

How do i go about this

Use Intent.ACTION_TIME_TICK This is a broadcast intent fired every minute by the Android OS. Register to it as you would register to a normal system broadcast in code (doesn't work from 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 article describes the complete process.

Use a Calendar to set the time to trigger to the next full minute, and repeat it every minute (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);
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);

Hope this code solved your problem

Use the Quartz Schedular API, make the corn job which run at every min.

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

Build the Schedular and trigger like that

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

and write your code in HelloJob class

 public class HelloJob implements Job {

  public void execute(JobExecutionContext context)
  throws JobExecutionException;

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

You can use below code for your requirement,

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

You can use Intent.ACTION_TIME_TICK.

Broadcast Action: The current time has changed. Sent every minute. You cannot receive this through components declared in manifests, only by explicitly registering for it with Context.registerReceiver().

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM