Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android应用程序中使用AlarmManager每午夜运行代码_Android_Android Intent_Broadcastreceiver_Scheduled Tasks_Alarmmanager - Fatal编程技术网

在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,所有的事情都及时地改变到正确的值。我想这是不可能的