У меня есть приложение, которое использует AlarmManager
, чтобы регулярно просыпаться по телефону в полный час и отправлять сообщение на часы Android Wear, что делает короткую вибрацию. У меня есть два пользователя с Samsung Galaxy S6 с запасом Android 5.1.1 и Sony SW 3 с 5.1.1, которые испытывают странную ошибку. В первый же полный час вибрация происходит в точное время, но все остальные вибрации задерживаются на 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 минуты.
У меня нет других сообщений об этой проблеме, и все мои тестовые устройства работают хорошо. У меня нет устройства Samsung.
Любые идеи, что может вызвать задержку в 3 минуты? Samsung игнорирует setExact
и делает мой сигнал неточным? Как заставить точную сигнализацию на Samsung?
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();