打盹模式对我的应用至关重要

Posted

技术标签:

【中文标题】打盹模式对我的应用至关重要【英文标题】:Doze mode is making critical to my app 【发布时间】:2017-09-06 07:25:25 【问题描述】:

我认为这个问题在 *** 中被问了很多次,但仍然有很多人在努力解决它。

在我的 android 应用程序中,我必须每 30 分钟唤醒一次设备以获取当前位置并将其发送到服务器。为此,我使用了具有 setExactAndAllowWhileIdle() 方法和 WakefulBroadcastReceiver 的 AlarmManager。它在几乎所有标准/流行设备中都可以正常工作,但其他一些设备主要是中国设备不支持或不允许使用 setExactAndAllowWhileIdle() 从打盹模式唤醒设备。我已经在 Moto G4 plus(Android OS 6.1) 设备上测试过它不允许闹钟管理器在特定的时间间隔唤醒。

我正在使用AlarmManager 调用wakefulBroadcastReceiver,它会触发wakefulIntentservice 来执行后台任务。但它严重耗尽电池并且处于打盹模式(牛轧糖),它不执行后台任务。除此之外,它从后端服务捕获数据。

my code is here->>

        // Setup periodic alarm every 30 minutes
        if (android.os.Build.VERSION.SDK_INT >= 23) 
            syncDbAlarmManager.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                    intervalMillis, pIntent);
         else if (android.os.Build.VERSION.SDK_INT >= 19
                && android.os.Build.VERSION.SDK_INT < 23)
            syncDbAlarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, triggerAtMillis/*firstMillis*/,
                    intervalMillis, pIntent);
         else 
            syncDbAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, triggerAtMillis/*firstMillis*/,
                    intervalMillis, pIntent);
        

我也用过PowerManager-->

PowerManager powerManager = (PowerManager) context.getSystemService(POWER_SERVICE);
PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
        "com.example.johnbravado");
wakeLock.acquire();
// Do Work
MyConstants.getInstance().msgReqAction(intent.getIntExtra(MyConstants.BROADCAST_DATA_REQ, 0));

wakeLock.release();

【问题讨论】:

【参考方案1】:

恐怕我只有部分答案。

根据我的经验,您不应该释放唤醒锁。我注意到如果您停止唤醒锁,摩托罗拉是如何唤醒的。这是不幸的,因为它使用更多的电池。如果你在三星手机上这样做,你的电池使用量会变得非常高。所以我建议你插入一个条件,如果品牌是摩托罗拉(和其他),你不要释放唤醒锁。 我很欣赏这是一个 hack,但它对我有用。

【讨论】:

但是它消耗太多电池,甚至在进入睡眠(打盹)模式后无法工作。 @FabioC 不,我不会释放唤醒锁。默认情况下,进入睡眠模式后根本不会触发服务。

以上是关于打盹模式对我的应用至关重要的主要内容,如果未能解决你的问题,请参考以下文章

Android 打盹模式 - 蓝牙

在不将应用列入白名单的情况下避免打盹模式

以打盹模式启动前台服务

与设备一起移动时,Android 不会退出打盹模式

当应用程序处于打盹模式时,警报管理器触发的 Android 通知未触发

是否可以在打盹模式或应用待机期间运行 Android 定期和一次性工作人员?