首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android精确闹钟总是在3分钟后

Android精确闹钟总是在3分钟后
EN

Stack Overflow用户
提问于 2015-12-04 03:53:08
回答 1查看 8.4K关注 0票数 20

我有一款应用程序,可以使用AlarmManager定时唤醒手机,并向Android Wear手表发送一条消息,然后手表发出短暂的振动。我有两个用户使用三星Galaxy S6与股票安卓5.1.1和索尼SW 3与5.1.1谁遇到了一个奇怪的bug。在第一个完整的小时,振动是在准确的时间,但所有其他振动是延迟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,让我的警报变得不准确吗?如何在Samsungs上强制发出准确的警报?

编辑:

以下是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();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-04 18:02:44

该问题似乎只出现在带有棒棒糖(5.0、5.1、5.1.1)的三星设备(例如Galaxy Grand、S4、S5、S6、Note3、Note4)上。当设备在关闭屏幕的情况下使用电池时,警报似乎被安排得不准确。如果设备正在充电或在计划报警期间屏幕处于打开状态,则不会发生问题。

您可以使用以下命令验证下一次警报是否不准确:

adb shell dumpsys alarm

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

  1. 使用setAlarmClock而不是setExact (参见this answer)。这工作得很好(不是在所有的设备上),但这个解决方案的问题是,警报将影响系统通过显示警报图标在状态栏(如果有人还没有闹钟设置),并显示下一个警报计划的时间在警报小工具等。不幸的是,虽然这适用于银河大与5.1.1,它不与5.0.1的银河S4。
  2. 启用屏幕之前计划的警报(我这样做半秒之前,以避免竞争条件)。当然,对于每个应用程序来说,启用screen只是为了安排下一个闹钟并不是一个好的解决方案。
  3. One bug report describing similar issue将其与应用程序包名称长度连接起来!我没有验证它是否真的解决了这个问题,因为更改包名称不是已经发布的应用程序的一个选项。
  4. 有一个another report,有人声称可以使用WakefulBroadcastReceiver解决这个问题,但在我的情况下不起作用。

顺便说一句,这个问题让我抓狂:)

警报编辑:当应用程序包名为(由Mathieu H.在下面的评论中指出)中存在关键字“”或"alert“时,似乎不会出现此问题。

我也能够手动修复这个问题,方法是在电池设置中(或在智能管理器应用程序中)禁用应用程序优化。它似乎不能通过编程来完成,所以你可以试着问你的用户……

票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34074955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档