如何按时钟时间更新片段
how to update fragment on clock time
我正在尝试按时钟时间更新片段,例如晚上 8 点,逻辑如下。不幸的是,它不会更新片段。任何 help/reference 将不胜感激。
我做了什么:
在应用程序 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);
在Fragment中监听AlarmManager如下:
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();
}
首先,PendingIntent
不会触发本地广播。您不能在此处使用 LocalBroadcastManager
。
其次,使用 AlarmManager
更新 UI 是相当奇怪的。如果您的 UI 存在,那么您有一个进程 运行,因此您可以使用一些进程中的东西(例如,ScheduledExecutorService
),而不是大惊小怪 AlarmManager
.
第三,您没有考虑到 set(Calendar.HOUR_OF_DAY, hour)
和 calendar.set(Calendar.MINUTE, minute)
可能会将 Calendar
更改为过去。想象一下,如果您在 23:00 执行第一个代码片段,hour
设置为 22
,minute
设置为 0
。您创建的 Calendar
对象适用于今天,但适用于 22:00 今天,也就是一个小时之前 (23:00)。您需要检查 Calendar
,看看它是否是过去的,如果是,则每天 add()
或以其他方式将其调整为将来的某个时间。
我正在尝试按时钟时间更新片段,例如晚上 8 点,逻辑如下。不幸的是,它不会更新片段。任何 help/reference 将不胜感激。
我做了什么:
在应用程序 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);
在Fragment中监听AlarmManager如下:
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(); }
首先,PendingIntent
不会触发本地广播。您不能在此处使用 LocalBroadcastManager
。
其次,使用 AlarmManager
更新 UI 是相当奇怪的。如果您的 UI 存在,那么您有一个进程 运行,因此您可以使用一些进程中的东西(例如,ScheduledExecutorService
),而不是大惊小怪 AlarmManager
.
第三,您没有考虑到 set(Calendar.HOUR_OF_DAY, hour)
和 calendar.set(Calendar.MINUTE, minute)
可能会将 Calendar
更改为过去。想象一下,如果您在 23:00 执行第一个代码片段,hour
设置为 22
,minute
设置为 0
。您创建的 Calendar
对象适用于今天,但适用于 22:00 今天,也就是一个小时之前 (23:00)。您需要检查 Calendar
,看看它是否是过去的,如果是,则每天 add()
或以其他方式将其调整为将来的某个时间。