Search code examples
androidandroid-fragmentsbroadcastreceiveralarmmanager

how to update fragment on clock time


I'm trying to update fragment on clock time, say for example 8PM, with below logic. Unfortunately, it doesn't update the fragment. Any help/reference would be appreciated.

What I did:

  1. registered an AlarmManager in app's Application class as below:

        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. Listens for AlarmManager in Fragment as below:

    LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mDashboardUpdateReceiver, new IntentFilter
            (AppConstants.INTENT_ACTION_UPDATE_DASHBOARD));
    
  3. and performs actions if broadcast receives:

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

Solution

  • First, a PendingIntent does not trigger a local broadcast. You cannot use LocalBroadcastManager here.

    Second, using AlarmManager to update a UI is rather odd. If your UI exists, you have a process running, so you could use something in-process (e.g., ScheduledExecutorService) rather than fussing with AlarmManager.

    Third, you are not taking into account that set(Calendar.HOUR_OF_DAY, hour) and calendar.set(Calendar.MINUTE, minute) might change the Calendar to be in the past. Imagine if you execute your first code snippet at 23:00, with hour set to be 22 and minute set to be 0. The Calendar object that you create will be for today, but for 22:00 today, which was an hour before now (23:00). You need to check the Calendar, see if it is in the past, and if so, add() a day or otherwise adjust it to some future time.