我有一个应用程序,我希望它每隔x天启动一次通知(由用户预定义)。为此,我正在使用此代码: 类扩展了广播接收器:
public class OnAlarmReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(ns);
int icon = R.drawable.icon;
CharSequence tickerText = "Votre vidange approche";
long when = System.currentTimeMillis();
Notification notification = new Notification(icon, tickerText, when);
CharSequence contentTitle = "Notification";
CharSequence contentText = "Vérifier votre kilométrage";
Intent notificationIntent = new Intent(context, Acceuil.class);
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
final int HELLO_ID = 1;
mNotificationManager.notify(HELLO_ID, notification);
}
}
此函数在另一个类中启动此前一个类:
public void repeating() {
AlarmManager mgr=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i=new Intent(context, OnAlarmReceiver.class);
PendingIntent pi=PendingIntent.getBroadcast(context, 0, i, 0);
mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 1800000, pi);
}
我将它设置为每隔半小时发布一次通知,但我从未接受过。 这段代码发生了什么?
非常感谢。
答案 0 :(得分:1)
SystemClock.elapsedRealtime()
表示“现在”达到毫秒级,因此有可能在它有机会运行时,triggerAtTime将会通过(不确定AlarmManager如何处理这种情况)。尝试将其延迟几秒钟以查看它是否正常运行:SystemClock.elapsedRealtime() + 10 * 1000
。
另一方面,重复大间隔(例如几天)的警报是不可靠的:如果您的进程被终止,或者抛出异常,或者设备重新启动,那么它的警报将被清除。一种替代方案(尽管不是100%防弹)将安排来自前一个警报的每个下一个警报并保存它将运行到共享偏好的时间。然后,每次您的应用程序启动时,检查下一个运行时间是否有效(即,将来),如果没有安排新的警报。