奇怪的AlarmManager行为 [英] Weird AlarmManager behaviour

查看:97
本文介绍了奇怪的AlarmManager行为的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有2个BroadcastReceivers和2个意图,我想单击一个按钮,然后在5m之后开始广播1,然后在10m之后开始广播2,发生的事情是它们都在我单击10m之后开始,我的猜测是,意图不是唯一的,但是我正在为每个参数设置不同的reqeustCode。

I have 2 BroadcastReceivers and 2 intents, I want to click a button, 5m later start broadcast1 and 10m later start broadcast2, what's happening is they both start 10m after I click, My guess is, the intents are not unique, but I'm setting a diffrent reqeustCode for each of them.

按钮的OnClick:

    Bundle bd = new Bundle();
    bd.putInt("mInt", i);

    Intent intent1 = new Intent(getActivity(), Broadcast_1.class);
    intent1.putExtras(bd);
    PendingIntent pendingIntent1 = PendingIntent.getBroadcast(getActivity().getApplicationContext(), i, intent1, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager1 = (AlarmManager) getActivity().getApplicationContext().getSystemService(Context.ALARM_SERVICE);
    alarmManager1.setRepeating(AlarmManager.RTC, System.currentTimeMillis()+1000*60*5, 1000*60*10, pendingIntent1);
    Toast.makeText(getActivity(), "countdown started "+i ,Toast.LENGTH_SHORT).show();

    Intent intent2 = new Intent(getActivity(), Broadcast_1.class);
    intent2.putExtras(bd);
    PendingIntent pendingIntent2 = PendingIntent.getBroadcast(getActivity().getApplicationContext(), i+42212342, intent2, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager2 = (AlarmManager) getActivity().getApplicationContext().getSystemService(Context.ALARM_SERVICE);
    alarmManager2.setRepeating(AlarmManager.RTC, System.currentTimeMillis()+1000*60*10, 1000*60*10, pendingIntent2);

BroadcastReceiver_1和_2(它们看起来相同)类:

public class Broadcast_1 extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        Calendar c = Calendar.getInstance();
        int seconds = c.get(Calendar.SECOND);
        int minutes = c.get(Calendar.MINUTE);
        ShowTextFragment.setText("Broadcast_1" + " at " + minutes + " : " + seconds);

    }

}

问题:
为什么最近的意图会将先前的意图推到他的开始时间?

Question: Why does the most recent intent push the previous intents to his starting time?

我通过打印时间来确认此行为。广播的代码执行。请帮助

I confirmed this behaviour by printing the time when the Broadcast's code executes. Please help

推荐答案

您所看到的问题是重复警报现在可以正常工作。为了保持电池寿命, AlarmManager 现在在重新安排警报以将多个警报组合在一起方面具有很大的自由度。基本上,如果您需要任何准确的计时,则应该忘记使用 setRepeating()。请使用 setExact()。如果您需要重复的闹钟,只需在闹钟响起时将其重置即可。

The problem you are seeing is the way that repeating alarms now work. In order to preserve battery life, the AlarmManager now takes great liberties in rescheduling alarms in order to group multiple alarms together. Basically, if you need any sort of accurate timing you should forget about using setRepeating(). Use setExact() instead. If you need a repeating alarm, just reset it when it goes off.

这篇关于奇怪的AlarmManager行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆