簡體   English   中英

預定鬧鍾重復時鍾android的每一分鍾

[英]scheduled alarm to repeat every minute of the clock 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);

我讓它每秒執行一次,以便在確切的時間發生效果。 而不是每一秒我都需要它在時鍾的每一分鍾變化(每分鍾)重復一次

我該如何解決這個問題

使用Intent.ACTION_TIME_TICK這是Android OS每分鍾觸發的廣播意圖。 注冊到它,因為您將注冊到代碼中的正常系統廣播(從清單不起作用)

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

文章描述了整個過程。

使用日歷設置觸發下一整分鍾的時間,並每分鍾重復一次(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);

希望這段代碼能解決你的問題

使用Quartz Schedular 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
}

您可以使用以下代碼滿足您的要求,

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

您可以使用Intent.ACTION_TIME_TICK。

廣播行動:當前時間已經改變。 每分鍾發送一次。 您不能通過在清單中聲明的​​組件來接收它,只能通過使用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM