0

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

在我的 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();
4

1 回答 1

0

恐怕我只有部分答案。

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

于 2017-04-30T13:40:10.903 回答