这是我看到的最奇怪的情况之一。

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

有什么建议吗?会是什么呢?我没有发现任何证据可以证明这种行为。也许是我自己的设备上的东西?

编辑:
广播接收器启动时,我在日志中添加了打印件。我看到每五分钟收到一次广播,但是意图没有得到执行!

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

 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。

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

<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()


这实际上表明该OS即将挂起Intent,您将当前时间增加300秒,然后恰好是五分钟后,您的接听电话并收到通知...

08-18 19:57
查看更多