Android AlarmManager触发每一轮“10分钟”

时间:2017-04-23 17:02:13

标签: android alarmmanager

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

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

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

每次触发警报时,我们都会向服务器发送HTTP请求。在所有设备上,我们都会看到随着时间的推移统一到服务器的请求,但是在HTC设备上每10分钟(XX:10,XX:20,......)都会出现峰值: enter image description here

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

4 个答案:

答案 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
  • 尝试this
  • 尝试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了解详情。

相关问题