AlarmManager 不适用于 Lollipop 中的三星设备

AlarmManager not working on Samsung devices in Lollipop

我开发了一个应用程序,它使用 AlarmManager 来设置需要在一年中的特定时间触发的一堆警报(通常大约 50 个)。 这是我使用的代码,因为 4.4 kitkat 更改了 AlarmManager。

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
long setDate = fireDate.getTime(); // it's a calendar date defined above
Intent intent = new Intent(LOCAL_DISPLAY_MESSAGE_ACTION);
PendingIntent pending = PendingIntent.getBroadcast(ctx,
                            id, intent, PendingIntent.FLAG_UPDATE_CURRENT);

if (Build.VERSION.RELEASE.startsWith("6")) {
    am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, setDate, pending);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
    am.setExact(AlarmManager.RTC_WAKEUP, setDate, pending);
} else {
    am.set(AlarmManager.RTC_WAKEUP, setDate, pending);
}

除了上面的代码,我还使用了在清单中正确定义的广播接收器。

public class LocalReceiver extends BroadcastReceiver {

    public void onReceive(Context context, Intent intent) {
        PushWakeLocker.acquire(context);

        // do some stuff

        PushWakeLocker.release();
    }
}

更多信息可能会有所帮助。

<uses-sdk
    android:minSdkVersion="10"
    android:targetSdkVersion="19" />

自几个月前以来,我一直收到来自三星设备(5.0 /5.1 android 版本)的差评,这些设备根本没有收到本地通知。我的意思是,它没有触发警报,设备似乎跳过它或没有唤醒。

在测试中,主要是使用 5.0.1 的三星 S4,我总是能准时收到警报,所以这让我抓狂。 仅供参考,此代码一直运行良好。

我对此进行了很多研究,但不幸的是我没有得到任何有用的信息。并不是他们延迟收到警报(正如我在某些线程中读到的那样),而是他们根本没有收到警报。所以这与 lollipop 和 alarmmanager 中的已知问题无关。

感谢您抽出时间,欢迎提出任何建议!

您的问题(或噩梦)是 Samsung Smart Manager。自 2015 年以来,所有三星手机都预装了这个应用程序,应该会停用未使用的应用程序。 "How does it know which apps are not used?" 你可能会问 - 简单:

所有 3 天未被用户启动的应用都会被停用。

所有剩余的 AlarmManager 条目 - 当然 - 也会被删除。您可以在他们的 "Developer Forums" 上阅读相关信息。请随时关注 here or here,直到这些帖子被工作人员删除。我还没有看到三星的人回应这个话题。

"fix"唯一的方法是通知您应用的用户有关情况,并向他们展示如何在智能管理器中将您的应用列入白名单。我们必须建立一个网站,其中包含向我们的用户展示如何执行此操作的分步说明。

您可能会考虑设置后台服务,或者每六小时左右调用一次 AlarmManager - none 这些 hacks 会奏效。

当设备重新启动时,它会清除警报,因此您的开机警报必须重新设置。