这是我见过的最奇怪的案例之一。
我有一个应用程序,每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);
答案 0 :(得分: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秒,然后恰好在五分钟之后,您接听电话并收到通知......