在Android应用程序中使用AlarmManager每午夜运行代码
我在这里看到了这个答案,但无法让它工作在Android应用程序中使用AlarmManager每午夜运行代码,android,android-intent,broadcastreceiver,scheduled-tasks,alarmmanager,Android,Android Intent,Broadcastreceiver,Scheduled Tasks,Alarmmanager,我在这里看到了这个答案,但无法让它工作 我有一个函数refreshtStuff(),它刷新片段的值。我在生成片段时、用户更新值时以及在onResume()期间调用此函数。我还想在午夜强制刷新,这与用户只看屏幕而不做任何事情有关 但是我不知道如何在我的MyFragment类中设置它。我试过: public class MyFragment extends Fragment { ... private AlarmManager alarmMgr; private Pendin
我有一个函数
refreshtStuff()
,它刷新片段的值。我在生成片段时、用户更新值时以及在onResume()
期间调用此函数。我还想在午夜强制刷新,这与用户只看屏幕而不做任何事情有关
但是我不知道如何在我的MyFragment
类中设置它。我试过:
public class MyFragment extends Fragment {
...
private AlarmManager alarmMgr;
private PendingIntent alarmIntent;
private Context context;
...
//in onCreate method
context = getActivity();
alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
//midnight I hope
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis()); //do I even need this?
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
AlarmManager.INTERVAL_DAY, alarmIntent);
如果我理解了答案,我必须在某处添加此方法:
@Override
public void onReceive(Context context, Intent intent) {
refreshStuff();
}
但是,我没有AlarmReceiver
任何地方,我不知道将onReceive()放在哪里,也不知道必须在清单中定义什么。我也不知道收到后是否必须“关掉它”?(当“警报”不应该“堆叠”时,它们会“堆叠”吗?)
否则,到目前为止这是正确的方法吗
编辑:
我尝试实现Commonware的答案:
public class MyFragment extends Fragment implements Runnable, SomeOtherListenersIUse, YetAnotherListenerEtc {
private View viewForDisplayingTotals;
//...rest of implementation omitted for brevity
@Override
public void run() {
refreshValues();
}
@Override
public void onStart() {
super.onStart();
refreshValues();
viewForDisplayingTotals.postDelayed(this, HelperMethods.getMillisecondsTillNextMidnight());
}
@Override
public void onStop() {
super.onStop();
viewForDisplayingTotals.removeCallbacks(this);
}
}
我的助手方法:
public static long getMillisecondsTillNextMidnight() {
Calendar c = Calendar.getInstance();
c.add(Calendar.DAY_OF_MONTH, 1); //add a day first
c.set(Calendar.HOUR_OF_DAY, 0); //then set the other fields to 0
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
return c.getTimeInMillis() - System.currentTimeMillis();
}
扔掉所有的AlarmManager
东西。这适用于在特定时间想要在后台获得控制权的情况,在您的情况下,这只是在前台时的问题
步骤1:将implements Runnable
添加到MyFragment
定义中
步骤2:这将要求您实现run()
方法,并在其中调用refreshtStuff()
步骤3:在onResume()
(或者更好的是,onStart()
)中,当您调用refreshtStuff()
,也可以在一些方便的视图中查看,其中…
是从现在到下一个午夜之间的毫秒数
步骤4:在onPause()
(或者更好的是,onStop()
)中,在相同的视图上调用removeCallbacks(this)
这将导致在午夜前后调用run()
方法,在那里调用refreshtStuff()
//我需要这个吗
对。但是请注意,您的计算是针对过去的午夜,忽略秒数<代码> Ad()/代码>一天,并考虑使用<代码> SET()/代码>将秒清零。< P> >删除所有<代码> AlalMasks<代码> >。这适用于在特定时间想要在后台获得控制权的情况,在您的情况下,这只是在前台时的问题
步骤1:将implements Runnable
添加到MyFragment
定义中
步骤2:这将要求您实现run()
方法,并在其中调用refreshtStuff()
步骤3:在onResume()
(或者更好的是,onStart()
)中,当您调用refreshtStuff()
,也可以在一些方便的视图中查看,其中…
是从现在到下一个午夜之间的毫秒数
步骤4:在onPause()
(或者更好的是,onStop()
)中,在相同的视图上调用removeCallbacks(this)
这将导致在午夜前后调用run()
方法,在那里调用refreshtStuff()
//我需要这个吗
对。但是请注意,您的计算是针对过去的午夜,忽略秒数<代码> Ad()/代码>一天,并考虑使用<代码> SET()/<代码>将秒清零。“我也想在午夜刷新刷新”——为什么?如果屏幕在午夜关闭,则当屏幕打开时,应使用onResume()
调用您。@Commonware如果用户碰巧在午夜查看屏幕而没有做任何事情,那么为什么午夜是特别的,而不是12:05、1:37或13:37?因为所讨论的片段显示每日总计,它们应该每天重置为0(具体来说,总数是通过计算数据库中的项目来计算的,其中timestamp=今天某个时候,所以在午夜,此过程将返回一个空集,因此总数为0)“我还想在午夜强制刷新”——为什么?如果屏幕在午夜关闭,则当屏幕打开时,应使用onResume()
调用您。@Commonware如果用户碰巧在午夜查看屏幕而没有做任何事情,那么为什么午夜是特别的,而不是12:05、1:37或13:37?因为所讨论的片段显示每日总计,而且它们应该每天重置为0(具体来说,总计是通过计算数据库中的项目来计算的,其中timestamp=今天某个时候,所以在午夜,此过程将返回一个空集,因此总计为0)。为什么onStart比onResume更好?当片段被创建和恢复或类似的事情时调用了这两个函数?我在我的帖子中尝试了实现您的步骤。我理解对了吗?哇,它成功了,所以我希望我理解对了!我试着将模拟器时钟设置为11:59,所有的事情都及时地改变到正确的值。我想如果用户(出于某种原因)在第一次滚动超过午夜后将此片段打开一整天,那么这将不起作用?(我不太担心这个问题,因为我无法想象它会在实践中发生,但我还是很好奇)@user7767902:“如果用户(出于某种原因)在第一次滚动到午夜后将此片段打开一整天,我想这不会起作用?”--不,您需要调用postdayed()
再次作为“嘿,现在是午夜!”处理的一部分postDelayed()
设置了一个一次性触发器。所以我还要在run()方法的末尾调用view.postDelayed()?为什么onStart比onResume更好?当片段被创建和恢复或类似的事情时调用了这两个函数?我在我的帖子中尝试了实现您的步骤。我理解对了吗?哇,它成功了,所以我希望我理解对了!我试着将模拟器时钟设置为11:59,所有的事情都及时地改变到正确的值。我想这是不可能的