几个小时过去后,Android 中的警报停止

Posted

技术标签:

【中文标题】几个小时过去后,Android 中的警报停止【英文标题】:Alarm in Android stops when some hours has passed 【发布时间】:2016-01-02 16:11:12 【问题描述】:

我正在制作一个需要重复执行某些任务的应用,通常在 1 到 5 分钟之间。

我试过.setRepeatingsetInexactRepeating.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 中的警报停止的主要内容,如果未能解决你的问题,请参考以下文章

Android的位置警报?

几个小时后,我的无尽后台服务自动停止。为啥?

如何在 Android 中停止重复警报服务?

Python 脚本在几个小时后停止

一个月一次,我收到此 Azure 警报消息“过去 1 小时的 db DTU 利用率为 0”

如何在android中的指定时间播放闹钟?