我在我的代码中设置了一个警报,以便在特定时间内启动.
警报机制适用于SDK< 19,但19日警报没有被解雇.
这是我设置闹钟的代码:
警报机制适用于SDK< 19,但19日警报没有被解雇.
这是我设置闹钟的代码:
public void SetAlarm(Context context,Long executionTime) { AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context,AlarmReciever.class); PendingIntent pi = PendingIntent.getBroadcast(context,intent,PendingIntent.FLAG_UPDATE_CURRENT); // Only one alarm can live,so cancel prevIoUs. am.cancel(pi); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { am.set(AlarmManager.RTC_WAKEUP,executionTime,pi); } else { setAlarmFromKitkat(am,pi); } }
由于我使用服务设置警报,因此我使用GetApplicationContext()作为上下文.
onReceive()代码:
@Override public void onReceive(Context context,Intent intent) { for (SchedulerListener listener : listeners) { listener.fetchAndRebuildNotification(); } }
这是BroadcastReceiver的声明:
<receiver android:name="com.SagiL.myAppName.BroadCastReceivers.AlarmReciever" />
回调在服务中运行一个方法(当警报发生时它仍处于活动状态,注意它不会启动它).
整个事情是在我的应用程序中使用的库,在那里我以相同的方式声明接收器.
有时警报会发射一次,但大多数情况下它根本不发射.
有没有人经历过这样的事情?
我不敢相信SDK 19很常见,因为很多应用程序都在使用AlarmManager,如果它很常见,它们也会破坏.
解决方法
我的申请遇到了类似的问题.我发现在getBroadcast(…)中使用0和id;工作得不好,造成了很多问题.
尝试将id从0更改为警报的真实ID.
从:
PendingIntent pi = PendingIntent.getBroadcast(context,PendingIntent.FLAG_UPDATE_CURRENT);
至:
PendingIntent pi = PendingIntent.getBroadcast(context,id,PendingIntent.FLAG_UPDATE_CURRENT);