public static final String CUSTOM_INTENT = "com.test.intent.action.ALARM";
public static Context ctx = OfferlyApplication.getContext();
@Override
public void onReceive(Context context, Intent intent) {
/* enqueue the job */
AlarmJobIntentService.enqueueWork(context, intent);
}
public static void cancelAlarm() {
AlarmManager alarm = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE);
/* cancel any pending alarm */
alarm.cancel(getPendingIntent());
}
public static void setAlarm(boolean force) {
cancelAlarm();
AlarmManager alarmManager = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE);
// EVERY X MINUTES
long delay = (1000 * 60 * 60);
long when = System.currentTimeMillis();
if (!force) {
when += delay;
}
/* fire the broadcast */
PendingIntent pendingIntent = getPendingIntent();
int SDK_INT = Build.VERSION.SDK_INT;
if (SDK_INT < Build.VERSION_CODES.KITKAT)
alarmManager.set(AlarmManager.RTC_WAKEUP, when, pendingIntent);
else if (SDK_INT < Build.VERSION_CODES.M)
alarmManager.setExact(AlarmManager.RTC_WAKEUP, when, pendingIntent);
else {
Log.d("JOB_SCHEDULING","waking device");
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, when, pendingIntent);
}
}
private static PendingIntent getPendingIntent() {
//Context ctx; /* get the application context */
Intent alarmIntent = new Intent(ctx, AlarmReceiver.class);
alarmIntent.setAction(CUSTOM_INTENT);
return PendingIntent.getBroadcast(ctx, 0, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT);
}
или с помощью диспетчера работы для периодов c работников
Constraints myConstraints = new Constraints.Builder()
.setRequiresDeviceIdle(false)
.setRequiresCharging(false)
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresBatteryNotLow(true)
.setRequiresStorageNotLow(true)
.build();
PeriodicWorkRequest saveRequest =
new PeriodicWorkRequest.Builder(NotificationWorker.class, 60, TimeUnit.MINUTES)
.setConstraints(myConstraints)
.build();
WorkManager.getInstance()
.enqueue(saveRequest);