2017-04-11 2 views
0

私はこの質問は、stackoverflowで何度も尋ねられますが、まだ多くの人がそれを解決するのに苦労していると思います。Dozeモードは私のアプリケーションにとって重要です

私のアンドロイドアプリでは、現在の場所を取得してサーバーに送信するために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(); 

答えて

0

私はちょうど部分的な答えを持っているかと思います。

私の経験では、wakeLockをリリースしないでください。あなたがウォークロックを止めればモトローラが目を覚まさないことに私は気づいた。それはより多くのバッテリーを使用するので、残念です。あなたがサムスンの携帯電話でそれをした場合、あなたのバッテリーの使用量は非常に高くなります。だから私はブランドがモトローラ(と他の人)であれば、あなたはwakelockをリリースしないという条件を挿入することをお勧めします。 ハックですが、それは私のために動作します。

+0

しかし、それはあまりにも多くの電池を消費し、スリープ(Doze)モードに入った後も動作しなくなる。 @FabioC –

+0

いいえ、私はwakeLockをリリースしていません。デフォルトでは、スリープモードに入った後もサービスを起動しません。 –

関連する問題