2016-08-30 27 views
1

私はAlarmManagerを含むアプリケーションで作業していますが、起動できないようです。私はHandlerを元々使っていましたが、私はAlarmManagerに切り替えて電話をスリープから復帰させることができます。AlarmManagerが定期的に起動しない

は、ここで私がこれまで持っているものです。

int timeBetweeninMillis = 3 * 60000;  
if (ManagerService.serviceRunning) { 
      Intent alarmIntent = new Intent(AlarmReceiver.ACTION_RECEIVE); 
      PendingIntent alarmPendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 400, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
      mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, (SystemClock.elapsedRealtime() + timeBetweeninMillis), alarmPendingIntent); 
     } 

AlarmManagerのいずれかが発生しませんまたは非常に遅く(10分後など)発生します。

アプリがAPI 16で書かれており、19

はあなたの助けをありがとうAPIとの電話でテストされています!

答えて

0

PendingIntent sリサイクルの既存のPendingIntentの問題があり、AlarmManagerで問題が発生する可能性があります。 、私はいつも私のすべてのPendingIntent秒に一意の値を追加し、このワンライナーはほとんどの場合、トリックを行うことを回避するには

Intent alarmIntent = new Intent(AlarmReceiver.ACTION_RECEIVE); 

alarmIntent.setData(Uri.parse("custom://" + System.currentTimeMillis())); // MAKE INTENT UNIQUE 

PendingIntent alarmPendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 400, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, (SystemClock.elapsedRealtime() + timeBetweeninMillis), alarmPendingIntent); 

また、私はあなたのコードでManagerService.serviceRunningだか分かりません実際にそのコードブロックを実行していることを確認するために、別のケースにいくつかのログを追加します。

EDIT:

これは要求されたとき、正確にあなたのコードを呼び出すためにAlarmManagerを強制し、アラームとの干渉デバイスのアイドル時間を防ぐことができます代わりにmAlarmManager.setmAlarmManager.setExactAndAllowWhileIdleを使用してみてください。

参照: https://developer.android.com/reference/android/app/AlarmManager.html#setExactAndAllowWhileIdle(int, long, android.app.PendingIntent)

+0

これは本当に何もしていないようでした。私のAlarmManagerはまだ発砲していません。 AlarmManagerの使い方を誤解していますか?私は 'timeBetweeninMillis'ミリ秒が経過した後、上記のコードが起動するはずです。また、ManagerService.serviceRunningはコードの実行を妨げていません。 –

+0

私の編集を参照してください、答えは – marmor

+0

でしょう。 '.setExactAndAllowWhileIdle'を使わないでこれを修正する方法はありますか?その関数はAPI 23を必要とし、API 19を使用しています –

関連する問題