Android中的警报会在几个小时后停止

时间:2016-01-02 16:11:12

标签: android alarmmanager alarm

我制作的应用程序需要重复执行某些任务,通常需要1到5分钟。

我已尝试.setRepeatingsetInexactRepeating.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);
}

2 个答案:

答案 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源代码才能得到答案。