Android 精确闹钟总是关闭 3 分钟

2024-03-29

我有一个应用程序使用AlarmManager定期在整点唤醒手机并向 Android Wear 手表发送消息,然后手表会发出短暂的振动。我有两个用户,他们分别使用安装了 Android 5.1.1 的三星 Galaxy S6 和安装了 5.1.1 的索尼 SW 3,他们遇到了一个奇怪的错误。在第一个完整的小时,振动是在准确的时间,但所有其他振动都会延迟 3 分钟。有时,甚至第一个整小时的振动也会延迟。

这是一些代码:

final Calendar time = Calendar.getInstance();
time.set(Calendar.SECOND, 0);
time.set(Calendar.MILLISECOND, 0);
time.set(Calendar.MINUTE, 0);
time.set(Calendar.HOUR_OF_DAY, time.get(Calendar.HOUR_OF_DAY) + 1);

final Intent hourlyChimeIntent = new Intent(context, HourlyChimeReceiver.class);
hourlyChimeIntent.setAction(key);
final AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
final PendingIntent pi = PendingIntent.getBroadcast(context, 0, hourlyChimeIntent, PendingIntent.FLAG_CANCEL_CURRENT);
am.setExact(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(), pi);

我获得了一个WakeLock接收器中,然后在线程中向 Wear 手表发送消息。没有错过任何振动,他们只是迟到了 3 分钟。

我没有关于此问题的其他报告,并且我的所有测试设备都运行良好。不过我没有三星设备。

有什么想法可能导致 3 分钟延迟吗?三星是否无视setExact并使我的闹钟不准确?如何对三星强制发出精确警报?

EDIT:

这是Android Wear 的具体代码。在接收器的onReceive方法我这样做:

final PowerManager mgr = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
final PowerManager.WakeLock lock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, BuildConfig.APPLICATION_ID);
lock.acquire(7L * 1000L);

final GoogleApiClient googleApiClient = new GoogleApiClient.Builder(context).addApi(Wearable.API).build();

new Thread(new Runnable() {
    @Override
    public void run() {
        googleApiClient.blockingConnect();

        long pattern[];
        pattern = new long[] {0L, 500L};

        final NodeApi.GetConnectedNodesResult nodes = Wearable.NodeApi.getConnectedNodes(googleApiClient).await(2000L, TimeUnit.MILLISECONDS);

        if (nodes != null) {
            for (final Node node : nodes.getNodes()) {
                // just send and forget
                Wearable.MessageApi.sendMessage(googleApiClient, node.getId(), "/hourly_chime", Utils.Vibrator.serializeVibratePattern(pattern).getBytes()).await();
            }
        }
    }
}).start();

该问题似乎仅发生在配备 Lollipop(5.0、5.1、5.1.1)的三星设备(例如 Galaxy Grand、S4、S5、S6、Note 3、Note 4)上。当设备使用电池且屏幕关闭时,闹钟的安排似乎不准确。如果设备正在充电或在安排闹钟期间屏幕打开,则不会出现此问题。

您可以通过以下方式验证下一个警报是否不准确:

adb shell dumpsys alarm

我没有找到解决这个问题的完美解决方案 - 只有解决方法,每个方法都有一些缺点:

  1. Use setAlarmClock反而setExact (see 这个答案 https://stackoverflow.com/questions/33260851/alarmmanager-not-working-as-expected-in-sleep-mode-on-s5-neo)。这非常有效(并非在所有设备上),但此解决方案的问题是闹钟会通过在状态栏中显示闹钟图标(如果有人尚未设置闹钟)并显示下一个闹钟预定时间来影响系统不幸的是,虽然这适用于 Galaxy Grand 5.1.1,但不适用于 Galaxy S4 5.0.1。
  2. 在安排警报之前启用屏幕(我在安排下一个警报之前执行此半秒以避免竞争条件)。当然,对于每个应用程序来说,启用屏幕只是为了安排下一个闹钟并不是一个好的解决方案。
  3. One 将其与应用程序包名称长度连接起来!我没有验证它是否真的解决了问题,因为更改包名称不是已发布的应用程序的选项。
  4. 另一份报告 https://code.google.com/p/android/issues/detail?id=82001有人声称这可以通过使用来解决WakefulBroadcastReceiver,但它不适用于我的情况。

顺便说一句,这个问题让我发疯:)

编辑:当应用程序包名称中存在关键字“alarm”或“alert”时,看起来不会出现此问题(正如 Mathieu H. 在下面的评论中指出的那样)。

我还可以通过以下方式手动解决问题禁用应用程序优化在电池设置中(或在智能管理器应用程序中)。看来它不能以编程方式完成,所以你可以尝试询问你的用户......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 精确闹钟总是关闭 3 分钟 的相关文章

随机推荐

  • 超越比较忽略所有文件中不重要的差异

    我正在使用Beyond Compare 3 3 4 我想比较大量文件并忽略不重要的差异 In Session gt Session Settings gt Comparison tab 需要打开文件 部分有一个 比较内容 基于规则的比较 当
  • IE 11 中的 VueJS - 的模板包装器不工作,但在 Edge 和 Chrome 中工作

    这是在 IE 11 中使用 Vue 2 5 16 假设datasetapp data 中的数组 以下内容在 Chrome 中运行良好 并且代码已简化 tbody tbody
  • 如何在 iOS 应用程序中创建自定义委托

    在 iPhone 中 每个 UIContrrol 都有预定义的委托方法 但是我们如何创建自己的自定义委托方法 在你的头文件中 之前 interface insert protocol YourDelegate
  • 按数组中的多个属性对对象进行分组,然后对它们的值求和

    按多个属性对数组中的元素进行分组 https codereview stackexchange com questions 37028 grouping elements in array by multiple properties是与我
  • React-Native-Table-Component 冻结可滚动表中的第一列和第一行

    期望状态 我正在使用react native table component 这是一个在 React Native 中渲染表格的基本组件 我需要冻结表中的第一列和第一行 以便滚动时它们保持在视图中 具体来说 我需要在水平滚动时第一列保持固定
  • gradle 1.10 内部 Maven 存储库在 intellij 13 中永远索引

    我有两个项目 一个 Maven 和一个 Gradle 该公司还有一个内部 Maven 存储库 我正在尝试设置 Gradle 以使用内部存储库 使用 Intellij 13 当我将像这样的存储库添加到 build gradle 中的 Grad
  • Maven 依赖项:树未显示所有传递依赖项

    我无法理解该人的行为依赖 树输出 当在更高的模块上运行插件时 我丢失了它所依赖的模块的重要信息 但是当我在较低的模块上运行插件时 我可以看到依赖项 这是一个显示问题的示例 名称已更改 mvn pl foo bar application d
  • 非 Windows 世界中的 COM?

    希望这个问题不会太含糊 通读 COM 规范和 Don Box 的 Essential COM 书 有很多关于 COM 解决的问题 的讨论 它们听起来都很重要 相关且重要 current https stackoverflow com que
  • React 组件未渲染到index.html

    我真的是 ReactJS 的初学者 组件没有渲染 我浪费了很多时间来搜索但没有成功 我正在跟进从这个系列 我已经从这里配置了 webpack dev serverlink https stackoverflow com questions
  • 动画不适用于 ::-webkit-slider-thumb

    我为 input type range 元素创建了一些自定义样式 我创建了以下动画 webkit keyframes balla from transform rotate 0 to transform rotate 360deg 我适用于
  • 通过nodejs、njs脚本语言扩展nginx

    我找到了您可以使用的 nginx 文档部分 ECMAScript 5 1 严格模式 以及一些 ECMAScript 6 和更高版本的扩展 扩展 nginx 作为用例 在请求到达上游服务器之前 njs 中进行复杂的访问控制和安全检查 http
  • 关于Java Cassandra Client,哪一个更好? CQL 怎么样? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试使用 Hive 作为数据库来开发应用程序 然后我还找到了 noSQL 解决方案作为它的替代方案 现在决定使用 Cassand
  • Notepad++改变文字颜色?

    我正在使用 Notepad 来模拟 ISPF 屏幕 我使用 StyleConfigurator 选择合适的字体 将其着色为绿色 并设置黑色背景 如何永久更改所选文本的颜色 例如 如果我的客户名称 THALECRESS 如何将客户名称 蓝色
  • 在 opentok ios sdk 中,呼叫者没有从接收者那里收到结束呼叫事件

    我有一个 iPhone 应用程序 我需要在其中管理从呼叫者到接收者的视频通话 并且它通过使用 Opentok 框架完美地工作 视频通话和音频一切正常 但我在从接收方结束呼叫而不接听电话时遇到问题 如果接收者接听电话然后结束通话 则呼叫者会收
  • 如何批量获取DynamoDB中的索引表?

    如何在DynamoDB中批量获取全局二级索引 这些参数给了我一个架构错误 因为这个哈希键仅在索引表中 主键有其他 const params RequestItems MyTableName Keys ThisHashKeyIsOnlyInI
  • ARM 汇编 SOS 中的 64 位除法

    我正在计算 16 个 64 位数字相加的平均值 我认为我已经正确完成了所有加法 但现在我需要弄清楚如何将 64 位数字除以 16 但我被困住了 任何帮助都会非常感谢你 到目前为止 这是我的代码 tableSize EQU 16 sum EQ
  • 破折号是 R 正则表达式中的特殊字符吗?

    尽管阅读了R 正则表达式的帮助页面 http stat ethz ch R manual R devel library base html regex html 最后 要包含文字 请将其放在第一个或最后一个 或者 对于 perl 仅 TR
  • AutoPostback 与 TextBox 失去焦点

    A TextBox被设定为AutoPostback因为更改值会导致重新计算和显示许多 仅显示 字段 效果很好 但是 当该字段被跳出时 焦点会短暂移动到下一个字段 然后在重新绘制页面时消失 因此任何地方都没有焦点 我希望焦点集中在新字段上 而
  • pandas 和 numpy 的平均值不同

    我有一个 MEMS IMU 我一直在其上收集数据 并使用 pandas 从中获取一些统计数据 每个周期收集 6 个 32 位浮点数 对于给定的收集运行 数据速率是固定的 数据速率在 100Hz 到 1000Hz 之间变化 收集时间长达 72
  • Android 精确闹钟总是关闭 3 分钟

    我有一个应用程序使用AlarmManager定期在整点唤醒手机并向 Android Wear 手表发送消息 然后手表会发出短暂的振动 我有两个用户 他们分别使用安装了 Android 5 1 1 的三星 Galaxy S6 和安装了 5 1