2017-04-11 101 views
0

我认为这个问题在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 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(); 

回答

0

恐怕我只是一个片面的答案。

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

+0

但它耗电过多,甚至在睡眠(打盹)模式后无法工作。 @FabioC –

+0

不,我不释放wakeLock。默认情况下,进入睡眠模式后根本不会触发服务。 –

相关问题