【问题标题】:AlarmManager not working on Samsung devices in LollipopAlarmManager 无法在 Lollipop 中的三星设备上运行
【发布时间】:2016-05-24 15:33:09
【问题描述】:

我开发了一个应用程序,它使用 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,我总是按时收到警报,所以这让我抓狂。 仅供参考,这段代码一直运行良好。

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

感谢您的宝贵时间,欢迎提出任何建议!

【问题讨论】:

  • “这是我正在使用的代码”——我会将您的 if 更改为检查 Build.VERSION_CODES.M。 “我正在使用广播接收器”——你的WakeLock 是不必要的,因为AlarmManager 触发时,onReceive() 在系统提供的WakeLock 中被调用。但是,除非“做一些事情”只有几毫秒,否则您应该将该逻辑移至IntentService 并使用WakefulBroadcastReceiver。除此之外,三星(如 SONY 等)在 6.0 之前有自己的打盹模式设置,因此 AlarmManager 是不可靠的,除非您被添加到某些特定于设备的白名单中。

标签: android alarmmanager android-5.0-lollipop samsung-mobile android-5.1.1-lollipop


【解决方案1】:

您的问题(或噩梦)是Samsung Smart Manager。自 2015 年以来,所有三星手机都预装了此应用程序,并且应该停用未使用的应用程序。 “它怎么知道哪些应用没有被使用?”你可能会问 - 很简单:

用户 3 天未启动的每个应用都会被停用。

所有剩余的 AlarmManager 条目 - 当然 - 也会被删除。您可以在他们的“开发者论坛”上阅读它。请随时关注herehere,直到这些帖子被工作人员删除。我还没有看到三星的人回应这个话题。

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

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

【讨论】:

  • 感谢您与我分享您的发现!你拯救了我的一天。三星做这样的事情而且对此不承担任何责任,这真的很烦人。嗯。
  • 更新:如果您的包名包含“alert”或“alarm”,Smart Manager 将不会停用该应用程序。更多信息:stackoverflow.com/a/34085645/128092
  • 你知道在这种情况下使用 JobScheduler 代替 AlarmManager 是否有帮助吗?
  • 我什么都不懂。在我的三星设备中,这根本不一致。我有一个警报应用程序,它并不总是有效,但是当我在电源设置中让它进入睡眠状态并设置一些警报进行测试时,它们就可以工作了。怎么会?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-29
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 2013-05-26
    • 2023-04-11
    相关资源
    最近更新 更多