几个小时过去后,Android 中的警报停止
Posted
技术标签:
【中文标题】几个小时过去后,Android 中的警报停止【英文标题】:Alarm in Android stops when some hours has passed 【发布时间】:2016-01-02 16:11:12 【问题描述】:我正在制作一个需要重复执行某些任务的应用,通常在 1 到 5 分钟之间。
我试过.setRepeating
、setInexactRepeating
和.set
(最后一个在任务完成时重新设置闹钟)
当警报触发时,服务就会启动。
通常它工作得很好,但有时无论我使用什么方法,警报都会突然停止。
我已经在 android 5.1 和 4.4.2 中测试过。
为什么会这样?这是一个已知的错误还是什么?
这是我用来设置闹钟的方法,注释代码是我尝试的另一种方法:
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);
【问题讨论】:
另外,您是否 100% 确定您的设备没有重新启动?因为手机重启后所有的闹钟都会消失。 它没有重新启动,虽然我有一个 BootReceiver 正在监听并再次设置警报。PreferenceHelper.readLong(PreferenceHelper.PREF_TIME_TO_REFRESH)
的近似值是多少分钟?
对不起,这取决于用户选择,在 1 分钟到 1 小时(1m、3m、5m、15m、30m、60m)之间,无论用户选择什么值,正如我所说的那样几小时后停止射击。
你也可以发布你的BroadcastReceiver
代码吗?
【参考方案1】:
我实际上遇到了同样的问题,并希望转移到 SyncAdapter,但有其他问题。所以不建议这样做会解决你的问题。
问题根本不在于警报管理器。我的应用程序针对 API > 23 并使用 API 24 手机进行测试,但仍然遇到此问题。问题是一些制造商正在 Android 之上创建他们自己的应用程序管理器,这会因为资源/电池原因而终止您的应用程序,这会阻止您的应用程序以及与之相关的任何警报触发。
查看这篇文章以检查应用程序是否处于停止模式。 Android AlarmManager stops when activity die
我注意到在某些手机上不会发生这种情况,而在某些手机上会发生这种情况......
如果这是错误的并且您确实发现了实际错误,请让我知道,因为同步适配器正在杀死我......
【讨论】:
【参考方案2】:作为一般原则,尽管您在 API setExactAndAllowWhileIdle 而不是 set
。
您所描述的:alarm suddenly stops firing after a few hours
听起来像是 M 设备中会发生的事情。我想知道当针对 API 23 时,这种行为是否也在 pre-M 设备中被故意强制...我需要查看 Android 源代码以获得答案。
【讨论】:
但是我不能使用setExactAndAllowWhileIdle
,因为最低SDK是14,可以吗?
是的,我意识到我不够清楚。我的意思是检查构建版本以使用 setExactAndAllowWhileIdle
用于 M,setExact
用于 pre-M,包括 KitKat,set
用于 pre-KitKat。我现在也看到我没有发布完整的答案......O_o。好吧,我想说,你为什么用0
作为标志而不是PendingIntent.FLAG_UPDATE_CURRENT
?另外,你在什么设备上测试?我以前在华为设备上也遇到过类似的问题。
我会试试的,谢谢。我没有使用PendingIntent.FLAG_UPDATE_CURRENT
,因为PendingIntent
始终相同,所以我不会向其添加额外数据。以上是关于几个小时过去后,Android 中的警报停止的主要内容,如果未能解决你的问题,请参考以下文章