gpt4 book ai didi

android - AlarmManager setRepeating 不适用于每日间隔

转载 作者:行者123 更新时间:2023-11-29 00:18:57 27 4
gpt4 key购买 nike

我在尝试设置每日通知时遇到问题。

我使用 AlarmManager 设置每天下午 6:00 的闹钟

Intent myIntent = new Intent(this, AlarmReceiver.class);
pendingIntent = PendingIntent.getBroadcast(this, 0, myIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
if (calendar.get(Calendar.HOUR_OF_DAY) >= 18) {
calendar.add(Calendar.DATE, 1);
}

calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.HOUR_OF_DAY, 18);
alarmManager.cancel(pendingIntent);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(), 24*60*60*1000,
pendingIntent);

但我不知道为什么第一个闹钟在 18:00 准时响起,而下一个闹钟却随机触发。有时是 19:30,有时是 20:06。我只是不明白我在这里出了什么问题。

我尝试了 INTERVAL_DAY24*60*60*1000 - 没有任何效果。但它在 1 分钟、5 分钟、10 分钟、1 小时等间隔时工作正常。

报警接收器:

public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent service1 = new Intent(context, MyAlarmService.class);
context.startService(service1);
System.out.println("alarm");
}
}

我的报警服务:

public class MyAlarmService extends Service {
private NotificationManager mManager;

@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}

@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
}

@SuppressWarnings("static-access")
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);

mManager = (NotificationManager) this.getApplicationContext().getSystemService(this.getApplicationContext().NOTIFICATION_SERVICE);
Intent intent1 = new Intent(this.getApplicationContext(),MainActivity.class);

Notification notification = new Notification(R.drawable.ic_launcher,"Test notification", System.currentTimeMillis());

intent1.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP| Intent.FLAG_ACTIVITY_CLEAR_TOP);

PendingIntent pendingNotificationIntent = PendingIntent.getActivity( this.getApplicationContext(),0, intent1,PendingIntent.FLAG_UPDATE_CURRENT);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notification.setLatestEventInfo(this.getApplicationContext(), "Test", "Test a notification", pendingNotificationIntent);

mManager.notify(0, notification);
}

@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
}
}

最佳答案

你有两个问题:

  1. setRepeating()在 Android 4.4+ 上不准确,带有 android:targetSdkVersion 19 岁或以上。

  2. 您没有使用 WakefulBroadcastReceiver , 我的 WakefulIntentService ,或您自己的 WakeLock ,因此设备可以在您的服务完成其工作之前触发警报之间的任何时间重新进入休眠状态。

在这种情况下,您只需移动 onStart() 中的代码即可更轻松地解决 #2。 (顺便说一句,已经弃用了 ~5 年)到 onReceive()并完全摆脱该服务。如果你正在做磁盘 I/O 或网络 I/O,你只需要这里的服务;提高Notification应该很便宜。

关于android - AlarmManager setRepeating 不适用于每日间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24351754/

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