gpt4 book ai didi

Android AlarmManager setRepeating 不会以长间隔重复

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:06:27 30 4
gpt4 key购买 nike

我已经实现了 AlarmManager 来每天唤醒手机一次以执行更新任务、更新小部件并在适用时发送通知。

我正在使用 setRepeatingELAPSED_REALTIME_WAKEUP第一次触发闹钟(SystemClock.elapsedRealtime()+60000)但它不会在 86400000 毫秒(24 小时)后触发。

我真的为此苦苦挣扎,我很高兴接受我做错了什么,或者是否有更好的方法来实现我想要做的事情。然而,我认为我的代码看起来像是人们似乎在做的标准事情。

这几乎就像重复警报在所有情况下都没有按照它说的去做。如果我将时间间隔减少到 10 分钟,它确实有效,我的警报会触发并且服务会一遍又一遍地运行。

我的应用程序的性质意味着每天更新一次以上是多余的。我需要为此找到一个切实可行的可靠解决方案。

感谢您抽出时间,希望您能为我指明正确的方向。

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

list :

<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 运行我的后台更新进程时,该服务的处理程序然后根据需要更新小部件并发送通知

更新报警接收器:

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

最佳答案

没有明显的问题。

不过,对于这样的长时间,我建议使用 RTC_WAKEUP,这样您就可以安排它在半夜或用户可选择的时间发生,而不是每 24 小时从一个半随机的起点开始。 RTC_WAKEUP 可能会给您带来更好的结果。

还有:

  • 将日志记录语句添加到 UpdateAlarmReceiveronReceive() 以确认您是否获得了控制权,或者问题是否(喘息!)与 WakefulIntentService.
  • 尝试稳步增加经期。既然你说 10 分钟有效,那就尝试一个小时,然后是四个小时,等等,并尝试了解它何时崩溃。
  • “我实际上正在使用 AutoKiller Memory Optimizer,它没有白名单,这可能是问题所在?尽管根据进程列表,我的应用仍在运行。” -- 我会禁用所有任务 killer ,只是为了确保它们不会干扰。

关于Android AlarmManager setRepeating 不会以长间隔重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7287844/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com