首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android AlarmManager在活动停止时停止。

Android AlarmManager在活动停止时停止。
EN

Stack Overflow用户
提问于 2015-06-24 21:49:41
回答 9查看 6.6K关注 0票数 18

我从AlarmManager开始使用PendingIntent,很少有电话报警没有响应。在一些设备上工作正常,在其他设备上,它失败了。我在不同的手机上做了几次测试。

Nexus工作正常,三星Galaxy S4变焦(4.2)也正常。

三星注2 (4.3)工作正常。

OPPO (4.4.4)报警死亡。

我还实施了广播接收器,这是他们应该在所有的设备上工作。

代码语言:javascript
复制
    Log.v(TAG, "START ALARM");

    Intent intentAlarm = new Intent(context, AlarmReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context.getApplicationContext(), 0, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, 1000, 5000, pendingIntent);
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2015-07-06 20:19:54

检查应用程序是否处于停止的state.When中,应用程序处于停止状态,它不会收到任何警报或事件。

此外,我想可能是OEM/制造商特定的固件/操作系统issue.To,检查警报是否确实在计划中,使用,亚行外壳虚拟警报,并检查您的应用程序警报是否已被实际调度。

要检查它是否处于已停止状态,请使用以下命令:

shell虚拟包"com.package.name"和check

要了解更多关于停止状态的信息,请参阅:

启动已停止应用程序的控制 从Android3.1开始,系统的包管理器跟踪处于停止状态的应用程序,并提供一种从后台进程和其他应用程序中控制应用程序启动的方法。 请注意,应用程序的停止状态与活动的停止状态并不相同。系统分别管理这两个停止状态。 该平台定义了两个新的意图标志,允许发送方指定是否允许该意图激活已停止的应用程序中的组件。 FLAG_INCLUDE_STOPPED_PACKAGES --在要解决的潜在目标列表中包括停止应用程序的意图筛选器。FLAG_EXCLUDE_STOPPED_PACKAGES -从潜在目标列表中排除停止应用程序的意图筛选器。如果这两个标志都不是在意图中定义的,则默认行为是在潜在目标列表中包括已停止应用程序的筛选器。 请注意,系统将FLAG_EXCLUDE_STOPPED_PACKAGES添加到所有广播意图中。这样做是为了防止后台服务的广播无意中或不必要地启动停止应用程序的组件。后台服务或应用程序可以通过将FLAG_INCLUDE_STOPPED_PACKAGES标志添加到应该允许激活已停止的应用程序的广播意图来覆盖此行为。 应用程序第一次安装时处于停止状态,但尚未启动,当用户手动停止应用程序时(在管理应用程序中)。

请注意,停止状态不同于未运行的应用程序进程。

票数 7
EN

Stack Overflow用户

发布于 2015-06-30 19:29:45

这里可能有几个不同的问题在起作用:

  • 您请求的警报类型(ELAPSED_REALTIME)不会唤醒设备来传递警报。相反,如果它在设备休眠时过期,它将在下一次设备醒来时交付。
  • triggerAtMillis1000在设备启动后1秒请求第一个警报。如果设备已经启动并运行,并且您请求此警报,则第一次警报可能不会触发,并可能导致后续的警报无法按计划进行。这只是猜测,我还没有通过查看4.4.4AOSP源代码来验证

在API 19 (Android4.4)中,对警报处理进行了更改,以处理警报计时器的排序(默认情况下,所有这些都不准确),而且这种更改可能会影响到第二个项目的内容。您可以尝试将triggerAtMillis值更改为(SystemClock.elapsedRealtime() + 1000)

请注意,如果您需要设备从睡眠中醒来,则需要使用_WAKEUP警报变体,并让您的BroadcastReceiver在处理警报时使用您的ServiceActivity释放的唤醒锁。

票数 5
EN

Stack Overflow用户

发布于 2015-06-30 19:28:31

这只是猜测,但我认为问题与API有关。从KitKat开始,系统会破坏AlarmManager。也许可以考虑在kitkat之上的abd系统上尝试使用其他的东西。

“注意:从API 19 (KITKAT)开始,警报传递是不准确的:操作系统将转移警报,以尽量减少唤醒和电池使用。有一些新的API支持需要严格传递保证的应用程序;请参见setWindow(int、long、long、PendingIntent)和setExact(int、long、PendingIntent)。如果应用程序的targetSdkVersion早于API 19,则会继续看到以前的行为,即所有警报都是在请求时传递的。”

取自http://developer.android.com/reference/android/app/AlarmManager.html

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31037720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档