Android AlarmManager触发每个“回合”10分钟

我在我的应用程序中使用AlarmManager,如下所示:

alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), AlarmManager.INTERVAL_HALF_DAY, intent); 

我期望在每次触发12到24小时之间触发报警。 但是,在HTC设备上的行为是相当奇怪的:

每次触发警报,我们都会向我们的服务器发送HTTP请求。 在所有设备上,随着时间的推移,我们可以看到统一的服务器请求,但在HTC设备上,每10分钟(XX:10,XX:20,…) 在这里输入图像说明

什么可能是这些尖峰的原因? 为什么只能在HTC设备上?

Solutions Collecting From Web of "Android AlarmManager触发每个“回合”10分钟"

我们看不到剩下的代码,但是你是否取消了以前的意图:

 AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); Intent alarmIntent = new Intent(context, TimeAlarm.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT); alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), AlarmManager.INTERVAL_HALF_DAY, pendingIntent); 

否则,这可能是HTC的AlarmManagerpipe理不当,尝试这些不同的调查(这可能看起来很荒谬,但最好挑战每个项目):

  • 单独为System.currentTimeMillis()而不是System.currentTimeMillis()添加一点延迟
  • 使用值43200000 (常数值)而不是AlarmManager.INTERVAL_HALF_DAY
  • Calendar试试这个
  • 尝试setInexactRepeating其他参数

我还没有发现任何已知和列出的这个问题上的错误。 如果你的调查没有提供任何东西,你可能无法做任何事情。 在这种情况下,您只需要为HTC设置一个不使用AlarmManager的解决方法。

首先取消以前的alaram

 private void cancelAlarm(Context context, Class aClass) { Intent intent = new Intent(context, aClass); PendingIntent pintent = PendingIntent.getService(context, REQUEST_CODE, intent, FLAG_UPDATE_CURRENT); AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarm.cancel(pintent); } 

然后创build新的闹钟就像那样

 public static void setAlarmManager(Context context, Class aClass, String time) { Intent intent = new Intent(context, aClass); PendingIntent pintent = PendingIntent.getService(context, REQUEST_CODE, intent, FLAG_UPDATE_CURRENT); AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); // alarm.cancel(pintent); // "auto_sync":"1","sync_time":"04:05" String timeArr[] = time.split(":"); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(timeArr[0])); calendar.set(Calendar.MINUTE, Integer.parseInt(timeArr[1])); alarm.setRepeating(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis(), INTERVAL, pintent); } 

在设备警报pipe理器pipe理不善。 在这种情况下,使用SharedPreferences在创build或更新新的警报pipe理器时保存以前的时间。 当您尝试运行您的日常操作时,保存的值也很有用。

我看你已经尝试AlarmManager.RTC_WAKEUP,你可以尝试AlarmManager.ELAPSED_REALTIME_WAKEUP?

由于电话打开,引导您发出警报

 <receiver android:name=".YourBootReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> <action android:name="android.intent.action.QUICKBOOT_POWERON"/> <action android:name="your.package.BOOT_FIRSTTIME"/> </intent-filter> </receiver> 

当用户激活警报时使用your.package.BOOT_FIRSTTIME。

然后,像这样configuration你的AlarmManager:

24小时(毫秒)是86400000

alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 86400000, pendingIntent);

添加间隔第二参数即triggerAtMillis帮助我

 alarm.setInexactRepeating(AlarmManager.RTC, calendar.getTimeInMillis()+interval, interval, pendingIntent); 

点击这里查看更多详情。