当前位置:  开发笔记 > 编程语言 > 正文

Android精确闹钟总是3分钟

如何解决《Android精确闹钟总是3分钟》经验,为你挑选了1个好方法。

我有一个应用程序,它使用它AlarmManager来定时唤醒整个小时的电话,并发送消息到Android Wear手表,这是一个短暂的振动.我有两个用户使用三星Galaxy S6和Android 5.1.1,索尼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分钟.

我没有关于这个问题的其他报告,我的所有测试设备都运行良好.我没有三星设备.

什么可能导致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();

Paweł Nadols.. 26

这个问题似乎只发生在三星设备上(例如Galaxy Grand,S4,S5,S6,Note 3,Note 4)和Lollipop(5.0,5.1,5.1.1).当设备处于电池状态且屏幕关闭时,警报似乎不准确.如果设备正在充电或在调度警报期间屏幕亮起,则不会发生此问题.

您可以验证下一个警报是否不准确:

adb shell dumpsys alarm

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

    setAlarmClock改为使用setExact(见这个答案).这非常有效(不是在所有设备上),但此解决方案的问题是警报会通过在状态栏中显示警报图标(如果有人没有设置闹钟)并显示下一个警报预定时间来影响系统警报小部件等等.不幸的是,虽然这适用于5.1.1的Galaxy Grand,但它不适用于5.0.1的Galaxy S4.

    在安排警报之前启用屏幕(在调度下一次警报之前我这样做半秒以避免竞争状况).当然,对于每个应用来说,启用屏幕只是为了安排下一个警报并不是一个好方法.

    一个描述类似问题的错误报告将其与app包名称长度联系起来!我没有验证它是否真的解决了这个问题,因为更改包名称不是已发布的应用程序的选项.

    还有另一个报告,有人声称这可以通过使用来修复WakefulBroadcastReceiver,但它在我的情况下不起作用.

BTW这个问题让我抓狂:)

编辑:当应用程序包名称中存在关键字"alarm"或"alert"时,看起来不会发生此问题(如Mathieu H.在下面的评论中所指出的).

我还可以通过在电池设置(或智能管理器应用程序)中禁用应用程序优化来手动修复此问题.它似乎无法以编程方式完成,因此您可以尝试询问您的用户......



1> Paweł Nadols..:

这个问题似乎只发生在三星设备上(例如Galaxy Grand,S4,S5,S6,Note 3,Note 4)和Lollipop(5.0,5.1,5.1.1).当设备处于电池状态且屏幕关闭时,警报似乎不准确.如果设备正在充电或在调度警报期间屏幕亮起,则不会发生此问题.

您可以验证下一个警报是否不准确:

adb shell dumpsys alarm

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

    setAlarmClock改为使用setExact(见这个答案).这非常有效(不是在所有设备上),但此解决方案的问题是警报会通过在状态栏中显示警报图标(如果有人没有设置闹钟)并显示下一个警报预定时间来影响系统警报小部件等等.不幸的是,虽然这适用于5.1.1的Galaxy Grand,但它不适用于5.0.1的Galaxy S4.

    在安排警报之前启用屏幕(在调度下一次警报之前我这样做半秒以避免竞争状况).当然,对于每个应用来说,启用屏幕只是为了安排下一个警报并不是一个好方法.

    一个描述类似问题的错误报告将其与app包名称长度联系起来!我没有验证它是否真的解决了这个问题,因为更改包名称不是已发布的应用程序的选项.

    还有另一个报告,有人声称这可以通过使用来修复WakefulBroadcastReceiver,但它在我的情况下不起作用.

BTW这个问题让我抓狂:)

编辑:当应用程序包名称中存在关键字"alarm"或"alert"时,看起来不会发生此问题(如Mathieu H.在下面的评论中所指出的).

我还可以通过在电池设置(或智能管理器应用程序)中禁用应用程序优化来手动修复此问题.它似乎无法以编程方式完成,因此您可以尝试询问您的用户......


关于包名称长度(第3点),假设几乎是正确的.经过多次测试后,我注意到如果包名包含'alarm'或'alert',则AlarmManager会在完美的时间触发警报.这似乎是三星获得电池寿命的坏方法.这适用于我测试的所有设备,而不是例如S4上没有工作的`setAlarmClock`.
找到其他解决方案,我开始检查三星框架.实际上有更多可能的包名称模式,如"时钟"... Smali代码:https://pastebin.com/J1XjXxxw我将继续寻找更好的解决方案,但其难以阅读的SMALI代码和转换器无法正常工作
我能够通过确保以小于15秒的间隔触发警报来解决这个问题.奇怪.例如,我的一个警报(每10秒)正确触发,但不是60秒警报.因此,当10s警报发射6次时,我启动了60s服务.初步结果看起来很积极
推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有