我制作的应用程序需要重复执行某些任务,通常需要1到5分钟。
我已尝试.setRepeating
,setInexactRepeating
和.set
(最后一个在任务完成后重新设置闹钟)
当警报触发时,服务开始。
通常它运作良好,但无论我使用何种方法,有时警报会突然停止发射。
我已在Android 5.1和4.4.2中测试过。
为什么会这样?这是一个已知的bug还是什么?
以下是我用来设置闹钟的方法,注释代码是我尝试过的另一种方法:
public void setAlarm(Context context) {
alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
/*alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP,
System.currentTimeMillis() + 1000,
PreferenceHelper.readLong(PreferenceHelper.PREF_TIME_TO_REFRESH), alarmIntent);*/
alarmMgr.set(AlarmManager.RTC_WAKEUP,
System.currentTimeMillis() + PreferenceHelper.readLong(PreferenceHelper.PREF_TIME_TO_REFRESH), alarmIntent);
ComponentName receiver = new ComponentName(context, BootReceiver.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
正如我之前所说,如果我使用.set
,我会在服务完成签名任务时再次调用该方法。 (这也有效,但几小时后警报突然停止发射)。
public class AlarmReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context, WifiCheckerService.class);
startWakefulService(context, service);
}
答案 0 :(得分:1)
我实际上遇到了同样的问题,并希望转而使用SyncAdapter,但还有其他问题。所以不建议这样可以解决你的问题。
问题根本不在于警报管理器。我的应用程序针对API> 23并使用API 24手机测试并仍然遇到此问题。问题是一些制造商正在Android上创建他们自己的应用程序管理器,并且由于资源/电池原因而导致您的应用程序被终止,这会阻止您的应用程序以及与之相关的任何警报触发。
查看此帖子以检查应用程序是否处于停止模式。 Android AlarmManager stops when activity die
我注意到在某些手机上没有发生这种情况,而且在某些手机上它确实发生了......
如果这是错误的并且您确实发现了实际上存在的错误,请告诉我,因为同步适配器正在杀死我....
答案 1 :(得分:0)
作为一般原则,尽管您在使用API<的设备中运行您的应用程序23,在您定位API 23时,您应该使用setExactAndAllowWhileIdle
而不是set
。
您所描述的内容:alarm suddenly stops firing after a few hours
听起来像M设备中会发生什么。我想知道在针对API 23时,这种行为是否也会在pre-M设备中被故意强制...我需要查看Android源代码才能得到答案。