我有一个应用程序使用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();