2011-09-02 69 views
6

我已经实现了AlarmManager来每天唤醒一次电话以执行更新任务,更新小部件并发送通知(如果适用)。Android AlarmManager setRepeating不会长时间间隔重复

我使用setRepeatingELAPSED_REALTIME_WAKEUP 报警被触发第一次(SystemClock.elapsedRealtime()+60000) ,但它不会86400000毫秒(24小时)后触发。

真的很难与此,我很高兴接受我做错了什么,或者如果有更好的方法来实现我想要做的事情。不过,我认为我的代码看起来像人们似乎做的标准事情。

这几乎就像重复报警没有做它说的应该在所有情况下。如果我将时间间隔缩短到10分钟,它就会起作用,我的警报会触发并且服务会一遍又一遍地运行。

我的应用程序的本质意味着每天更新不止一次是矫枉过正。 我需要找到一个现实可靠的解决方案。

感谢您的时间&希望您能指出我的正确方向。

这里是我报警的实现代码...

清单:

<receiver android:name=".SystemChangeReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     <action android:name="android.intent.action.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE" /> 
    </intent-filter> 
</receiver> 
<receiver android:name=".UpdateAlarmReceiver" /> 
<service android:name=".UpdateService" /> 
<receiver android:name=".WidgetProviderSmall" android:label="@string/widget_small_label"> 
    <intent-filter> 
     <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
    </intent-filter> 
    <meta-data 
     android:name="android.appwidget.provider" 
     android:resource="@xml/appwidget_small" /> 
</receiver> 
<receiver android:name=".WidgetProviderLarge" android:label="@string/widget_large_label"> 
    <intent-filter> 
     <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
    </intent-filter> 
    <meta-data 
     android:name="android.appwidget.provider" 
     android:resource="@xml/appwidget_large" /> 
</receiver> 

SystemChangeReceiver侦听启动广播,如果报警需要检查设置,如果这样做,将其设置。

SystemChangeReceiver

@Override 
public void onReceive(Context context, Intent intent) { 

    SharedPreferences prefs = context.getSharedPreferences(context.getString(R.string.prefs_name), 0); 

    Boolean notifications = prefs.getBoolean("enable_updates", false); 
    if(notifications == true) { 
     Utils.setNotificationAlarm(context); 
    } 
} 

的setNotificationAlarm方法,设置重复报警......

public static void setNotificationAlarm(Context context) { 
     AlarmManager alarmManager=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 

     Intent intent = new Intent(context, UpdateAlarmReceiver.class); 
     PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); 

     alarmManager.setRepeating(
      AlarmManager.ELAPSED_REALTIME_WAKEUP, 
      SystemClock.elapsedRealtime()+60000, 
      86400000, 
      pi); 
} 

当警报触发我的接收机UpdateAlarmReceiver决定做什么和使用WakefulIntentService运行我的后台更新过程,服务处理程序然后更新小部件并根据需要发送通知

UpdateAlarmReceiver

public void onReceive(Context context, Intent intent) { 
    WakefulIntentService.sendWakefulWork(context, UpdateService.class); 
} 
+0

可以解决所有这些问题的快速问题:你使用任务杀手吗?你的应用在白名单上? –

+0

我实际上使用AutoKiller Memory Optimizer,它没有白名单,这可能是问题?根据进程列表,我的应用程序仍在运行。 – Rob

回答

1

您是否尝试将其设置为不重复。那么当它发射时,你会在24小时后发出下一次单发警报?这会像重复报警一样工作,但可能会避免您看到的一些问题。

+0

我没有考虑过这个。我认为这基本上是setRepeating所做的。我会尽力的,谢谢。 – Rob

+0

我做了一个闹钟类型的应用程序,这是我处理它的方式,它似乎对我来说正确地提示AlarmActivity在第二天的正确时间启动。我从来没有使用过setRepeating()标志,所以我不知道为什么这样做不起作用,在我看来,这两种方法应该都是一样的。它会在触发时没有正确地唤醒设备吗? – FoamyGuy

+0

我认为这是使用'WakefulIntentService'是用'PowerManager.WakeLock' – Rob

2

没有什么明显的错误。

虽然这么长时间,我建议RTC_WAKEUP,所以你可以安排它在半夜或用户可选择的时间发生,而不是每24小时从半随机起点。有可能RTC_WAKEUP会给你更好的结果。

另外:

  • 添加日志记录语句的UpdateAlarmReceiveronReceive()确认是否在所有得到控制,或问题是否是(哇!)与WakefulIntentService
  • 尝试稳步增加你的时间。既然你说10分钟的作品,尝试一个小时,然后四个小时等,并试图在它发生故障时感觉到。
  • “我实际上使用的是AutoKiller Memory Optimizer,它没有白名单,这可能是问题所在?根据进程列表,我的应用程序仍在运行。” - 我会禁用所有的任务杀手,只是为了确保它们不会干扰。
+0

感谢马克,我已经添加了在各个地方登录,与间隔长的甚至不打报警接收机,Im相当肯定精细醒来,即时其警报管理器在某处发生故障。我现在禁用了内存优化器,生病尝试所有其他建议。 – Rob

+0

@Rob:我知道的唯一事情就是摆脱预定警报:如果你取消()它,如果用户强制从设置应用程序中的管理服务中停止它,或者任务杀手停止它(这可能只是2.1和更早的问题 - 我不希望'killBackgroundProcesses()'消灭警报,但我可能在那里是错误的)。希望你会发现AutoKiller是罪魁祸首。 – CommonsWare

相关问题