La alarma exacta de Android siempre está a 3 minutos

Tengo una aplicación que usa elAlarmManager para despertar regularmente el teléfono a una hora completa y enviar un mensaje a un reloj Android Wear que luego produce una vibración corta. Tengo dos usuarios con un Samsung Galaxy S6 con Android 5.1.1 y el Sony SW 3 con 5.1.1 que experimentan un error extraño. En la primera hora completa, la vibración es a la hora exacta, pero todas las demás vibraciones se retrasan 3 minutos. A veces, incluso la primera hora completa de vibración se retrasa.

Aquí hay un código:

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);

Adquiero unWakeLock en el receptor y luego envíe un mensaje al reloj Wear en un hilo. No se pierde ninguna vibración, solo tienen 3 minutos de retraso.

No tengo otros informes sobre este problema y todos mis dispositivos de prueba funcionan bien. Sin embargo, no tengo ningún dispositivo Samsung.

¿Alguna idea de lo que podría causar el retraso de 3 minutos? ¿Samsung ignorasetExact y hace que mi alarma sea inexacta? ¿Cómo forzar alarmas exactas en Samsung?

EDITAR:

Aquí está el código específico de Android Wear. En el receptoronReceive método hago esto:

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();

Respuestas a la pregunta(1)

Su respuesta a la pregunta