gpt4 book ai didi

android - 为什么我下面的实现会在警报不应该响起的时候触发警报?

转载 作者:搜寻专家 更新时间:2023-11-01 08:05:26 24 4
gpt4 key购买 nike

我正在实现一个 AlarmManager 来为我的应用程序请求更新,这应该每天只发生一次。我不希望闹钟一创建就响。为此,我创建了一个日历对象。

它也会在创建警报时触发。请注意,这并不总是会发生。 我注意到这个问题只在一天中的特定时间发生。我住在香港,我希望不会因为我的时区而出现任何问题。除了使用 AlarmManager.INTERVAL_DAY,我还尝试使用 24*60*60*1000。 只有当日历磨机比当前磨机旧时才会发生这种情况。在删除此问题之前,我将检查当前时间是否更新并在日历对象中添加 24*60*60*1000。

这是一个创建 AlarmManager 的服务。此服务也会在启动时启动。只是为了确定 dataPreferenceObj,它是我的应用程序中 DataPreference 类的一个实例,它处理我的应用程序的 SharedPreferences 相关调用。 ACTION_SCHEDULE_ALARM 是 Keys ENUM 类的一部分,它包含所有字符串常量。

public class TukiService extends Service {

private static AlarmManager calendarAlarmManager;
private static PendingIntent calendarPendingIntent;
private static final int SCHEDULE_REQUEST_CODE = 1001;

@Override
public void onCreate() {
super.onCreate();

updateScheduleUpdate();
}

private static void updateScheduleUpdate() {

if (dataPreferenceObj.getEnabledUpdate() == true) {
cancelScheduleUpdate();
requestScheduleUpdate();
} else if (dataPreferenceObj.getEnabledUpdate() == false) {
cancelScheduleUpdate();
}
}

private static void requestScheduleUpdate() {
setScheduleAlarmParamaters();

Calendar calendar = new GregorianCalendar();
calendar.set(Calendar.HOUR_OF_DAY, 9);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);

scheduleAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY,
schedulePendingIntent);
}

/*
* Cancels an existing alarm if user doesn't want to auto update.
*/
private static void cancelScheduleUpdate() {
setScheduleAlarmParamaters();
scheduleAlarmManager.cancel(schedulePendingIntent);
}

private static void setScheduleAlarmParamaters() {
Intent intent = new Intent(Keys.ACTION_SCHEDULE_ALARM.toString(),
Uri.parse(Long.toString(SCHEDULE_REQUEST_CODE)), context,
AlarmReceiver.class);

schedulePendingIntent = PendingIntent.getBroadcast(mContext,
SCHEDULE_REQUEST_CODE, intent,
PendingIntent.FLAG_UPDATE_CURRENT);

scheduleAlarmManager = (AlarmManager) mContext
.getSystemService(Context.ALARM_SERVICE);
}

这是一个接收广播的广播接收器:

public class ScheduleReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {

if (intent.getAction().equals(Keys.ACTION_SCHEDULE_ALARM.toString())) {

if (TukiService.SCHEDULE_REQUEST_CODE == Long.parseLong(intent
.getData().getSchemeSpecificPart())) {
new NetworkHandler(context).fetchAutoEnabledUpdate();
}
}
}

这是我在 mainfest 中的接收器声明:

    <uses-permission android:name="android.permission.WAKE_LOCK" />
<receiver
android:name="com.milanix.tuki.service.ScheduleReceiver"
android:enabled="true" >
</receiver>
<service android:name="com.milanix.tuki.service.TukiService" >
</service>

最佳答案

我现在已经解决了这个问题。似乎如果 triggerAtMillis 早于 currentMillis,则无论您何时设置它都会触发警报。我编写了以下代码来检查 triggerAtMillis 是否早于 currentMillis。如果它早于我们将在 triggerAtMillis 中添加一个天间隔。现在无论我什么时候设置闹钟,它总是会在准确的时间触发,如果闹钟时间过去了,它会在第二天的同一时间触发。这是它的代码:

public static final int INTERVAL_DAY = 24 * 60 * 60 * 1000;

private static void requestScheduleUpdate() {
setScheduleAlarmParamaters();

Calendar calendar = new GregorianCalendar();
calendar.set(Calendar.HOUR_OF_DAY, 15);
calendar.set(Calendar.MINUTE, 55);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);

long triggerMillis = calendar.getTimeInMillis();

if (calendar.getTimeInMillis() < Calendar.getInstance()
.getTimeInMillis()) {
triggerMillis = calendar.getTimeInMillis() + INTERVAL_DAY;

System.out.println("Alarm will go off next day");
}

scheduleAlarmManager
.setRepeating(AlarmManager.RTC_WAKEUP, triggerMillis,
AlarmManager.INTERVAL_DAY, schedulePendingIntent);
}

如果有人能指出比这个更好的解决方案,那就太好了。

关于android - 为什么我下面的实现会在警报不应该响起的时候触发警报?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14980863/

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