2016-11-13 10 views
0

ユーザー定義の間隔でサーバーにデータを送信するインテントサービスを作成しましたが、私の場合は、アラームマネージャによって間隔が正しく維持されません。私はどこでエラーを出しているのか教えてくれますか?私はスリープモードまたはアイドルモードでもデバイスを実行しながらサービスを実行したい。ここに私のコードです。インテントサービスの時間間隔が維持されていません

public void sosalarmson() { 
     Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class); 
     final PendingIntent pendingIntent = PendingIntent.getBroadcast(this, AlarmReceiver.receivercode, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), Integer.parseInt(userdefinedinterval) *60* 1000, pendingIntent); 
     Toast.makeText(FinalSettings.this, "alarm On", Toast.LENGTH_SHORT).show(); 
    } 

理想的には、ユーザー入力を15とした場合、アラームは15分でインテントを送信する必要がありますが、10分で送信します。

は定義::私はこのコードを使用していますし、それが完璧に働いている

答えて

0

final int SDK_INT = Build.VERSION.SDK_INT; 
AlarmManager al; 
PendingIntent fintent; 
Intent notif; 

を私は直接アラームmanager._alarmを使用してサービスを開始していますが、あなたの事前に定義された間隔です。

long _alarm; 

     Calendar now = Calendar.getInstance(); 
     Calendar wakeupcall = Calendar.getInstance(); 
     wakeupcall.setTimeInMillis(System.currentTimeMillis()); 
     wakeupcall.set(Calendar.HOUR_OF_DAY, 18); 
     wakeupcall.set(Calendar.MINUTE, 30); 

     if (wakeupcall.getTimeInMillis() <= now.getTimeInMillis()) 
      _alarm=wakeupcall.getTimeInMillis() + (AlarmManager.INTERVAL_DAY+1); 
     else 
      _alarm=wakeupcall.getTimeInMillis(); 

al = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
     notif= new Intent(this,TestNotifyService.class); 
     fintent = PendingIntent.getService(this,0,notif,0); 

if (SDK_INT < Build.VERSION_CODES.KITKAT) { 
      al.set(AlarmManager.RTC_WAKEUP,_alarm, fintent); 
     } 
     else if (Build.VERSION_CODES.KITKAT <= SDK_INT && SDK_INT < Build.VERSION_CODES.M) { 
      al.setExact(AlarmManager.RTC_WAKEUP,_alarm,fintent); 
     } 
     else if (SDK_INT >= Build.VERSION_CODES.M) { 
      al.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,_alarm,fintent); 
     } 
+0

あなたはElapsedTimeの代わりにRTCを使用しましたが、ドキュメントごとにRTCはスリープモード(壁時計の時刻はUTC)の時間をカウントしません。それでも使用できますか? –

+0

私は毎日22:00にこのコードを使用しています。そして、それは正確な期間を実行しています。 –

+0

私は15分の間隔で実行したい場合は、_alarmを15 * 60 * 1000に置き換えます。しかし、どこに時間を置くのが好きなのかは、20時頃です。 –

関連する問題