我在我的应用程序中使用AlarmManager,如下所示:
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), AlarmManager.INTERVAL_HALF_DAY, intent);
我期望在每次触发后的12到24小时之间触发警报。但是,特别是在HTC设备上的行为相当奇怪:
每次触发警报时,我们都会向服务器发送HTTP请求。在所有设备上,我们都会看到随着时间的推移统一到服务器的请求,但是在HTC设备上每10分钟(XX:10,XX:20,......)都会出现峰值:
这些尖峰的原因是什么?为什么它只能在HTC设备上?
答案 0 :(得分:2)
我们无法看到您的其余代码,但是您是否取消了以前的意图:
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对AlarmManager的管理不善,尝试这些不同的调查(这看起来很荒谬,但挑战每个项目更好):
System.currentTimeMillis()
添加一点延迟,而不是单独System.currentTimeMillis()
43200000
(常数值)而不是AlarmManager.INTERVAL_HALF_DAY
Calendar
setInexactRepeating
我没有在此主题上找到任何已知和列出的错误。如果您的调查没有提供任何内容,您可能无法做任何事情。在这种情况下,您只需要为HTC设置一个不使用AlarmManager的解决方法。
答案 1 :(得分:2)
首先取消之前的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);
}
然后创建新警报
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);
}
在设备上警报管理器管理不善。在这种情况下,使用 SharedPreferences 可以在创建或更新新的警报管理器时节省以前的时间。当您尝试运行日常操作时,保存的值也很有用。
答案 2 :(得分:1)
我看到你试过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>
当用户激活闹钟时使用.package.BOOT_FIRSTTIME。
然后,像这样配置你的AlarmManager:
24小时毫秒是86400000
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 86400000, pendingIntent);
答案 3 :(得分:0)
将间隔添加到第二个参数,即triggerAtMillis帮助我
alarm.setInexactRepeating(AlarmManager.RTC, calendar.getTimeInMillis()+interval, interval, pendingIntent);
检查here了解详情。