リピート時間を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();
}
ドキュメントを更新する必要があります。 Android 5.1(APIバージョン22))の時点では、アラームを繰り返すための最小期間は1分であり、今後5秒未満にアラームを設定することはできません。
1分以内に作業を行う必要がある場合は、アラームを直接設定してから、そのアラームのハンドラーから次のアラームを設定します。
5秒以内に作業を行う必要がある場合は、アラームマネージャーを使用する代わりにハンドラーに投稿しますか?
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);
}
}
私はまったく同じ問題を抱えていました。私はこれをデバッグするのに数時間費やしましたが、最後に、繰り返し時間が1分未満に設定されていると、常に1分のスケジュールでアラームが発生することがわかりました!?
私はこの例に従いました: http://www.compiletimeerror.com/2015/02/how-to-make-alarm-repeat-in-Android-code.html#.Vp5UrCorKM8
アラームは8秒で発火しますが、私の場合は発火しません。
繰り返し時間を数分に設定してみましたが、うまくいきました。また、レシーバーからのアラームの発生がより正確な繰り返し時間を与えることも知りました(1つのレシーバーはアラームマネージャーを起動するためのもので、カスタムインテントフィルターによって呼び出されます)
次のコードを試してください:
_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より前のアプリケーションでは、要求されたときにすべてのアラームが正確に配信される以前の動作が引き続き表示されます。
参照
このコードを試してください:Calendar cal = Calendar.getInstance(); alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 5000, pendingIntent);
これを試して
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);
これを試して
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);
}