如何按时钟时间更新片段

how to update fragment on clock time

我正在尝试按时钟时间更新片段,例如晚上 8 点,逻辑如下。不幸的是,它不会更新片段。任何 help/reference 将不胜感激。

我做了什么:

  1. 在应用程序 class 中注册了一个 AlarmManager,如下所示:

        alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent().setAction(AppConstants.INTENT_ACTION_UPDATE_DASHBOARD);
        alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
    
        // Set the alarm to start at Consulting start time
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, hour);
        calendar.set(Calendar.MINUTE, minute);
        alarmMgr.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), alarmIntent);
    
  2. 在Fragment中监听AlarmManager如下:

    LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mDashboardUpdateReceiver, new IntentFilter
            (AppConstants.INTENT_ACTION_UPDATE_DASHBOARD));
    
  3. 并在广播收到时执行操作:

    private BroadcastReceiver mDashboardUpdateReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
             Log.d(TAG, "Dashboard updating...");
             updateCounters();
         }
    

首先,PendingIntent不会触发本地广播。您不能在此处使用 LocalBroadcastManager

其次,使用 AlarmManager 更新 UI 是相当奇怪的。如果您的 UI 存在,那么您有一个进程 运行,因此您可以使用一些进程中的东西(例如,ScheduledExecutorService),而不是大惊小怪 AlarmManager.

第三,您没有考虑到 set(Calendar.HOUR_OF_DAY, hour)calendar.set(Calendar.MINUTE, minute) 可能会将 Calendar 更改为过去。想象一下,如果您在 23:00 执行第一个代码片段,hour 设置为 22minute 设置为 0。您创建的 Calendar 对象适用于今天,但适用于 22:00 今天,也就是一个小时之前 (23:00)。您需要检查 Calendar,看看它是否是过去的,如果是,则每天 add() 或以其他方式将其调整为将来的某个时间。