2017-12-28 40 views
1

私はラジオの目覚まし時計を意図どおりに動作させるのに苦労しましたが、私はそのトピックについて多くのスレッドを読んでいますが、unfortunatleyは私を助けませんでした。setAlarmClock()はドーズモードで遅すぎます

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);   
Intent intent = new Intent(this, AlarmReceiver.class); 
PendingIntent penInt = PendingIntent.getBroadcast(this, intentId, intent, 0); 

私はstackoverflowの上、こちらをご覧APIレベル間の区別のこの方法と関係なく、デバイス上で使用されているものをAPI正しくアラームを設定しないように私のcalcNextAlarm()機能(プラスデバッグのためのいくつかのログメッセージ)の中に置きます:

// problems in doze mode api 23+ 
if (Build.VERSION.SDK_INT >= 23) { 
    if (testMode) Log.d("Ben", "setAlarmClock() - API 23+"); 
    am.setAlarmClock(new AlarmManager.AlarmClockInfo(alarmTimeInMillis, penInt), penInt); 
} 

else if (Build.VERSION.SDK_INT >= 19) { 
// Wakes up the device in Idle Mode 
    if (testMode) Log.d("Ben", "setExact() - API >= 19 && API < 23"); 
    am.setExact(AlarmManager.RTC_WAKEUP, alarmTimeInMillis, penInt); 
} 
// Old APIs 
else { 
    if (testMode) Log.d("Ben", "set() - API < 19"); 
    am.set(AlarmManager.RTC_WAKEUP, alarmTimeInMillis, penInt); 
} 

私はそれを見ることができますLog.dメッセージによると、私のAndroid 7.1デバイスでの第一の方法setAlarmClock()は、受信側でアラームを設定するために実行されています。

私は失敗したテストの3週間後に本当に必死とコーディングしています - 居眠りモードのトレーニングページによると、この現象が発生することはありません - 今日は4分手遅れ再び降りた私のアラームを:設定

アラームをsetAlarmClock()が正常に発火し続ける - システムはDozeを終了し、それらのアラームが発生する直前に終了します。

私の7.1電話では、アラームを「今すぐ+5または6分」に設定すると、アラームが20秒から1:40分遅れることさえあります。誰も本当にいつも完全に時間外にアラームを出す方法を私にアドバイスできますか?

答えて

1

は、使用してみてください:

setExactAndAllowWhileIdle() 

これは、時間上のアラーム火災を保証します。私は自分のアプリでそれをテストし、それは信頼できるです。

23未満のAPIをターゲティングする場合は、これをif節に入れて、デバイスにインストールされている現在のAPIをチェックします。私は正確に) に差し込まれているバッテリーなしで居眠りモードでそれをテストしている

1):あなたのコメントに答えるために

すべての権利をsetExact

を使用し続ける残りのため、唯一のAPIレベル23の上方にこれを使用しますうん、残念ながら、アイドルタイプのアラームの場合、9分の制限ごとに1つのアラームがあります。ここには2つの選択肢があります:

最初にsetExactAndAllowWhileIdleを使用して、最初のアラームを発生させます。

a)にスヌーズについて、あなたはスヌーズためsetAlarmClock方法

B)を使用する必要があります、あなたはあなたのスヌーズ時間として設定された最小遅延時間でスケジュールjobschedulerのジョブを持つことができます。これにより、ジョブが少なくともスヌーズ間隔の間隔でスケジュールされるようになります。しかし、これにより、インターバル後にジョブがランダムにスケジューリングされるため、最小レイテンシの直後にジョブがスケジュールされるように、オーバーライド期限を0に設定する必要があります。また、ネットワーク要件をnoneに設定し、アイドルモードをデフォルトまたはfalseにする必要があります。これは私の経験と同じように、正確な方法でアラームとして信頼できるものであり、私はこのアプローチを個人的に使用しています。

+0

これは、setAlarmClockメソッドのような潜在的な通知もユーザーに表示しません。今ではそれは絶対に正確ではありませんが、私の経験によれば、5〜10秒ほどで比較的正確です。最後に、必要なときに優先順位の高いFCMメッセージをデバイスに当てるという方法がありますが、これはネットワーク接続に依存します。 – Kushan

+0

私は前にそれを試したと確信していますが、私はとても必死で、私はそれにショットを与えます:) 1:それはbatterayで正確であり、請求されていませんか? 2:dozeトレーニングページに従う: '注意:setAndAllowWhileIdle()もsetExactAndAllowWhileIdle()も、1回につき2回以上のアラームを発生させることはできません 5分間スヌーズしたい場合は、** setExactAndAllowWhileIdle()**の代わりに通常の** setAlarmClock()**を使用してスヌーズする必要がありますか? 3:ターゲットAPI 27と最小SDKは16です。 – Ben

+0

これで試してみてください。私が指定した2つと既に使用しているものは、とにかくドーズモードを扱う唯一のものです。アイドル状態が私のために最も効果的なときに許可しますいくつかのデバイスでそれをテストしました。いつもうまく動作します – Kushan

関連する問題