【发布时间】:2015-12-03 19:53:08
【问题描述】:
我有一个应用程序,它使用AlarmManager 定期在整点唤醒手机并向 Android Wear 手表发送一条消息,该手表会产生短暂的振动。我有两个用户,他们的三星 Galaxy S6 和 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 并让我的闹钟不准确吗?如何强制三星发出准确的警报?
编辑:
这是 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();
【问题讨论】:
-
一个想法:也可能是警报按时发送,但稍后在某个地方引入了延迟。由于您的问题没有具体说明,我会问:您确定实际的警报传递延迟了吗?
-
嗯,想一想,我不能 100% 确定这是警报传递。我怀疑打开与 Wear 设备的连接可能需要长达三分钟或通过蓝牙发送 Wear 消息。我会将 Wear 特定代码添加到问题中。
-
我有同样的问题,当我希望我的应用程序在每个星期日的 18 点更新,但它没有完成工作,有时它没有工作,有时它被延迟,我不知道是谁在谷歌做这项工作,但它做错了,我认为是意图 [目的:)]
-
我仅在三星设备上报告了此问题。在很多情况下,三星更改了一些核心功能以“优化”它,并在它在纯 Android 中运行时破坏它。
标签: android alarmmanager wear-os