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

时间:2017-04-11 04:41:17

标签: android android-doze

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

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

我正在使用AlarmManager来调用wakefulBroadcastReceiver,它会唤醒wakefulIntentservice以执行后台任务。但它的排水电池非常严重,并且还处于打瞌睡模式(Nougat),它没有做背景任务。除此之外,它从后端服务捕获数据。

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 - &gt;

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 个答案:

答案 0 :(得分:0)

我恐怕只有部分答案。

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