Android 如何按时钟时间更新片段

Android 如何按时钟时间更新片段,android,android-fragments,broadcastreceiver,alarmmanager,Android,Android Fragments,Broadcastreceiver,Alarmmanager,我试图用下面的逻辑在时钟时间更新片段,例如8PM。不幸的是,它没有更新片段。如有任何帮助/推荐,将不胜感激 我所做的: 已注册应用程序内的应用程序类,如下所示: alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent().setAction(AppConstants.INTENT_ACTION_UPDATE_DASHBOARD);

我试图用下面的逻辑在时钟时间更新片段,例如8PM。不幸的是,它没有更新片段。如有任何帮助/推荐,将不胜感激

我所做的:

  • 已注册应用程序内的应用程序类,如下所示:

        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);
    
    LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mDashboardUpdateReceiver, new IntentFilter
            (AppConstants.INTENT_ACTION_UPDATE_DASHBOARD));
    
  • 侦听片段中的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);
    
    LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mDashboardUpdateReceiver, new IntentFilter
            (AppConstants.INTENT_ACTION_UPDATE_DASHBOARD));
    
  • 并在广播接收到以下内容时执行操作:

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

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

    其次,使用
    AlarmManager
    更新UI是相当奇怪的。如果您的UI存在,则您有一个正在运行的进程,因此您可以使用进程中的某些东西(例如,
    ScheduledExecutorService
    ),而不必忙于处理
    AlarmManager

    第三,您没有考虑到
    set(Calendar.HOUR\u OF_DAY,HOUR)
    Calendar.set(Calendar.MINUTE,MINUTE)
    可能会将
    日历更改为过去。想象一下,如果您在23:00执行第一个代码段,
    hour
    设置为
    22
    minute
    设置为
    0
    。您创建的
    日历
    对象将用于今天,但用于今天的22:00,这是一个小时前(23:00)。您需要检查
    日历
    ,查看它是否是过去的日历,如果是过去的日历,则将
    添加()
    一天,或者将其调整到未来某个时间