web-dev-qa-db-ja.com

設定されている時間に関係なく、AlarmManagerのsetRepeating()が1分後に繰り返されます(この場合は5秒、API 18以降)。

リピート時間を5秒に設定しました。最初のトーストは5秒後に表示されますが、次のトーストはすべて1分後に繰り返されます。
setRepeating()でもコードを試しましたが、まだ機能しません。
これが私のコードです:

public void constructJob(){

    Intent alertIntent = new Intent(this, AlarmManagerService.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
            this, 0,
            alertIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    alarmManager.setInexactRepeating(
            AlarmManager.RTC_WAKEUP,
            GregorianCalendar.getInstance().getTimeInMillis(),
            repeatTime(),
            pendingIntent
    );

}

public long repeatTime(){
    return 5000;
}

AlarmManagerService.Java

public class AlarmManagerService extends BroadcastReceiver {
      @Override
      public void onReceive(Context context, Intent intent) {
             Toast.makeText(context, "5 seconds have passed",
                            Toast.LENGTH_SHORT).show();
}
19
Nikhil Tambe

ドキュメントを更新する必要があります。 Android 5.1(APIバージョン22))の時点では、アラームを繰り返すための最小期間は1分であり、今後5秒未満にアラームを設定することはできません。

1分以内に作業を行う必要がある場合は、アラームを直接設定してから、そのアラームのハンドラーから次のアラームを設定します。

5秒以内に作業を行う必要がある場合は、アラームマネージャーを使用する代わりにハンドラーに投稿しますか?

17
ctate

SetRepeating()またはsetInExactRepeatingは使用しないでください。正確に5秒後に繰り返されません。代わりに、アラームを一度スケジュールしてから、onReceive()メソッドで次のように再スケジュールしてください。これは、特定の時間間隔(この場合は5秒)の後に繰り返されます

MainActivity.Java

public class MainActivity extends AppCompatActivity {

Button btnStartAlarm, btnStopAlarm;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btnStartAlarm = (Button) findViewById(R.id.btnStartAlarm);
    btnStopAlarm = (Button) findViewById(R.id.btnStopAlarm);

    Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
    final PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 100, intent, 0);

    final AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    btnStartAlarm.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, pendingIntent);
        }
    });

    btnStopAlarm.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            alarmManager.cancel(pendingIntent);
        }
    });
}
 }

AlarmReceiver.Java

public class AlarmReceiver extends BroadcastReceiver {
public AlarmReceiver() {
}

@Override
public void onReceive(Context context, Intent intent) {

    Log.d("Javed", "onReceive called");
    Toast.makeText(context, "onReceive called", Toast.LENGTH_LONG).show();

    Intent intent1 = new Intent(context, AlarmReceiver.class);
    final PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 100, intent1, 0);
    final AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, pendingIntent);
}
  }
12
Javed Khatri

私はまったく同じ問題を抱えていました。私はこれをデバッグするのに数時間費やしましたが、最後に、繰り返し時間が1分未満に設定されていると、常に1分のスケジュールでアラームが発生することがわかりました!?

私はこの例に従いました: http://www.compiletimeerror.com/2015/02/how-to-make-alarm-repeat-in-Android-code.html#.Vp5UrCorKM8

アラームは8秒で発火しますが、私の場合は発火しません。

繰り返し時間を数分に設定してみましたが、うまくいきました。また、レシーバーからのアラームの発生がより正確な繰り返し時間を与えることも知りました(1つのレシーバーはアラームマネージャーを起動するためのもので、カスタムインテントフィルターによって呼び出されます)

0
nmirkov

次のコードを試してください:

_Long time = new GregorianCalendar().getTimeInMillis() +  3000;
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,time,5000, pendingIntent);
_

このコードを実行すると、アラームは最初に3秒後にトリガーされ、その後5秒ごとにトリガーされます。

また、しばらくすると、携帯電話が居眠りモードになったように見えるため、WakefulBroadcastReceiverではなくBroadcastReceiverを使用してみてください(Android Mの場合)。正しく使用するには、_WAKE_LOCK_権限が含まれていることを確認してください。

さらに、注意する必要があります。アラームの最初のトリガーは、要求された時間より前ではありませんが、その時間の後、ほぼ完全な間隔で発生しない可能性があります。さらに、繰り返し発生するアラームの全体的な期間は要求どおりですが、アラームが連続して2回発火するまでの時間はさまざまです。

さらに

setInExactRepeating()は、トリガー時間の正確性を保証しません。 API 19の前にsetRepeating()を使用できますが、API 19(KitKat)以降のアラーム配信は不正確です。ウェイクアップとバッテリーの使用を最小限にするために、OSはアラームをシフトします。できることは、繰り返し発生しないアラームを設定し、アラームがトリガーされたら、BroadcastReceiverでアラームを再度リセットすることです。厳密な配信保証が必要なアプリケーションをサポートする新しいAPIがあります。 setWindow(int, long, long, PendingIntent)およびsetExact(int, long, PendingIntent)を参照してください。 targetSdkVersionがAPI 19より前のアプリケーションでは、要求されたときにすべてのアラームが正確に配信される以前の動作が引き続き表示されます。

参照

setInexactRepeating()公式ドキュメント

StackOverflow回答

0
Parag Kadam

このコードを試してください:
Calendar cal = Calendar.getInstance(); alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 5000, pendingIntent);

0
GIRIDHARAN

これを試して

    Calendar cur_cal = new GregorianCalendar();

    PendingIntent pintent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
    AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarm.cancel(pintent);
    alarm.setRepeating(AlarmManager.RTC, cur_cal.getTimeInMillis(), interval, pintent);
0
Srishti Roy

これを試して

public void constructJob(){
Intent alertIntent = new Intent(this, AlarmManagerService.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
        this, 0,
        alertIntent,
        PendingIntent.FLAG_UPDATE_CURRENT);

AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(
        AlarmManager.RTC_WAKEUP,
        GregorianCalendar.getInstance().getTimeInMillis(),
        1000*5,
        pendingIntent);

}
0
Kishan Soni