安卓。报警管理器。重复警报不会触发,并且在一段时间后会立即触发所有警报

Posted

技术标签:

【中文标题】安卓。报警管理器。重复警报不会触发,并且在一段时间后会立即触发所有警报【英文标题】:Android. Alarm Manager. Repeating alarm does not fire, and after some time, fires all the alarms at once 【发布时间】:2014-01-07 16:08:36 【问题描述】:

这是我见过的最奇怪的案例之一。

我有一个应用程序每 5 分钟执行一次任务。我使用以下代码设置重复警报:

public static final int INTERVAL_SECONDS = 300;

public void SetAlarm(Context context)

    AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent i = new Intent(context, Alarm.class);
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
    am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * INTERVAL_SECONDS, pi); // Millisec * Second * Minute

因此,我希望每五分钟运行一次以下代码:

 @Override
 public void onReceive(Context context, Intent intent) 
    
    PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
    wl.acquire();

    Intent pper = new Intent(context, PushPullService.class);
    context.startService(pper);
    Log.d("AlarmReceiver", "Called context.startService from AlarmReceiver.onReceive");

    wl.release();
 

我的应用在清单中有以下权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

我看到很奇怪的事情。我在意图开始时添加了写入日志文件。我看到有奇怪的模式:

每 5 分钟有一个事件(在意图过程开始时打印到日志中),但有时我在一段时间内在日志文件中什么都看不到,然后我一次看到很多事件。一起运行的事件数(一个接一个)似乎是我希望在没有触发事件的时间段内出现的事件数。

有什么建议吗?会是什么呢?我没有找到任何证据证明这种行为。也许是我自己的设备里的东西?

编辑: 当广播接收器被触发时,我在日志中添加了一个打印。我看到每五分钟接收一次广播,但意图没有运行!

我还为每个意图添加了一个唯一的 ID,正如 Irfan Ahmed 提供的那样,但这并没有解决问题:

 Intent i = new Intent(context, Alarm.class);
 i.setData(Uri.parse(String.valueOf(System.currentTimeMillis())));
 PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, Intent.FLAG_GRANT_READ_URI_PERMISSION);

【问题讨论】:

我认为问题是广播接收器你能发布广播接收器类和清单文件吗? 你能解决你的问题吗?我有类似的问题,找不到解决办法 【参考方案1】:

您需要在这里为每个警报设置一个唯一的 id..

首先,检查你的清单,它看起来像这样,

<receiver android:name="com.example.Somename.Alarm" >
    <intent-filter>
        <data android:scheme="timer:" />
    </intent-filter>
</receiver>

然后,在你的 setAlarm 方法中,

Intent i = new Intent(context, Alarm.class);
i.setData(Uri.parse("timer:" + uniqueId));
PendingIntent pi = PendingIntent.getBroadcast(context, uniqueId, i, Intent.FLAG_GRANT_READ_URI_PERMISSION);

时间戳或什么生成uniqueId,

编辑

当你使用设置闹钟时,

am.setRepeating()

这实际上将pendingIntent分配给操作系统,并且您将当前时间增加300秒,然后恰好在五分钟后,您的接听电话并收到通知...

【讨论】:

为什么重要?唯一ID给了我什么。你认为我每五分钟收到一次广播,但意图没有被解雇吗?如果是这样,那么究竟会发生什么(后来谁触发了意图)? 使用唯一的id,可以设置不同的闹钟,不会互相覆盖。 Android 重用待处理的意图,重写它们携带的有效负载。 Irfan 是对的,您必须在创建意图时使用唯一 ID,以防止覆盖。我过去也遇到过这个问题。 评论:我应该把这些行放在哪里?在 SetAlarm 中还是在 onRecieve 中?因为你提到了pendingIntent,所以我把它们放在了SetAlarm方法中,它不起作用。有关新的详细信息,请参阅问题版本。 我想,你可以从这个想法中理解,无论如何,我会更新我的答案!

以上是关于安卓。报警管理器。重复警报不会触发,并且在一段时间后会立即触发所有警报的主要内容,如果未能解决你的问题,请参考以下文章

在Android警报管理器中设置时间-立即触发警报[重复]

当应用程序处于打盹模式时,警报管理器触发的 Android 通知未触发

PendingIntents / AlarmManager不会添加延迟但会立即触发警报

如何触发电池百分比更改的事件?

应用程序中运行的计时器在一段时间后开始延迟触发,原因不明

屏幕关闭时,Android 10 会阻止网络请求和 GPS 呼叫