鉴于AlarmManager.setInexactRepeating()函数仅适用于API 19以下的API,我使用了AlarmManager.setExact()函数用于API 19向上并使用广播接收器执行所需任务然后再次调用警报功能使它成为一个重复的警报。警报有效但不符合预期的重复间隔。我做了一些研究,看看其他人做了什么,我的机智结束了。
我创建了一个类来处理警报,如下所示:
public class AlarmStart {
public AlarmStart() {
}
public void startAlarm(Context context) {
// Start service
if(Build.VERSION.SDK_INT < 19) {
Intent service = new Intent(context, MyService.class);
PendingIntent pendingIntent = PendingIntent.getService(context, 0, service, 0);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
AlarmManager.INTERVAL_DAY, AlarmManager.INTERVAL_DAY,
pendingIntent);
}
else {
Intent intent = new Intent(context, MyBroadcastReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, 1000 * 60 * 60 * 24, pendingIntent);
}
// Enable receiver when device boots
ComponentName receiver = new ComponentName(context, BootReceiver.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
下面是BroadcastReceiver类中的代码,该代码调用服务以间隔执行(运行良好),然后再调用startAlarm()函数:
public class MyBroadcastReceiver extends BroadcastReceiver {
AlarmStart alarmStart = new AlarmStart();
public MyBroadcastReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
// Start service
Intent service = new Intent(context, MyService.class);
context.startService(service);
//Schedule next alarm
alarmStart.startAlarm(context);
}
在AndroidManifest.xml中,我将广播接收器的启用和导出属性设置为true。
有人可以告诉我我可能做错了吗?
答案 0 :(得分:0)
你搞砸了开始时间。
替换
alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, 1000 * 60 * 60 * 24, pendingIntent);
与
alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+(1000 * 60 * 60 * 24), pendingIntent);
与
相同alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, AlarmManager.INTERVAL_DAY, AlarmManager.INTERVAL_DAY, pendingIntent);
替换为
alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+AlarmManager.INTERVAL_DAY, AlarmManager.INTERVAL_DAY, pendingIntent);
问题是你在错误的时刻发出了警报。