安卓。报警管理器。重复警报不触发,一段时间后,一次触发所有警报

标签 android android-intent alarmmanager repeatingalarm

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

我有一个应用程序,每 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();
 }

我的应用在 list 中具有以下权限:

<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" />

我看到了很奇怪的东西。我在 Intent 的开头添加了写入日志文件的内容。我看到有奇怪的模式:

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

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

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

我还为每个 Intent 添加了一个唯一的 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);

最佳答案

你需要为这里的每个闹钟设置一个唯一的id..

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

<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 秒,然后恰好在五分钟后,您的接听电话和您收到通知...

关于安卓。报警管理器。重复警报不触发,一段时间后,一次触发所有警报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20675786/

相关文章:

android - 在相机和图库之间进行选择以进行图像选择

java - 如何在用户时间线上打开 Facebook 应用程序?

Android - 如何在带有 ✔ 的按钮上设置文本颜色作为 Android M 上的文本

android - 漏斗中的数据不正确

android - 为 ICS 准备好应用

android - 如何从android中的ArrayAdapter类调用下一页

android - AlarmManager 在 sleep 模式下不工作

java - 从 Android 中最近使用的应用程序列表中删除应用程序是否会导致其禁用 Android 应用程序中闹钟管理器设置的任何闹钟?

Android:Looper 与 AlarmManager

android - 项目所有者没有足够的权限来验证 google in app 订阅