| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package io.flutter.plugins.androidalarmmanager; |
| |
| import android.content.BroadcastReceiver; |
| import android.content.ComponentName; |
| import android.content.Context; |
| import android.content.Intent; |
| import android.content.pm.PackageManager; |
| import android.util.Log; |
| |
| /** |
| * Reschedules background work after the Android device reboots. |
| * |
| * <p>When an Android device reboots, all previously scheduled {@link AlarmManager} timers are |
| * cleared. |
| * |
| * <p>Timer callbacks registered with the android_alarm_manager plugin can be designated |
| * "persistent" and therefore, upon device reboot, should be rescheduled for execution. To |
| * accomplish this rescheduling, {@code RebootBroadcastReceiver} is scheduled by {@link |
| * AlarmService} to run on {@code BOOT_COMPLETED} and do the rescheduling. |
| */ |
| public class RebootBroadcastReceiver extends BroadcastReceiver { |
| /** |
| * Invoked by the OS whenever a broadcast is received by this app. |
| * |
| * <p>If the broadcast's action is {@code BOOT_COMPLETED} then this {@code |
| * RebootBroadcastReceiver} reschedules all persistent timer callbacks. That rescheduling work is |
| * handled by {@link AlarmService#reschedulePersistentAlarms(Context)}. |
| */ |
| @Override |
| public void onReceive(Context context, Intent intent) { |
| if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) { |
| Log.i("AlarmService", "Rescheduling after boot!"); |
| AlarmService.reschedulePersistentAlarms(context); |
| } |
| } |
| |
| /** |
| * Schedules this {@code RebootBroadcastReceiver} to be run whenever the Android device reboots. |
| */ |
| public static void enableRescheduleOnReboot(Context context) { |
| scheduleOnReboot(context, PackageManager.COMPONENT_ENABLED_STATE_ENABLED); |
| } |
| |
| /** |
| * Unschedules this {@code RebootBroadcastReceiver} to be run whenever the Android device reboots. |
| * This {@code RebootBroadcastReceiver} will no longer be run upon reboot. |
| */ |
| public static void disableRescheduleOnReboot(Context context) { |
| scheduleOnReboot(context, PackageManager.COMPONENT_ENABLED_STATE_DISABLED); |
| } |
| |
| private static void scheduleOnReboot(Context context, int state) { |
| ComponentName receiver = new ComponentName(context, RebootBroadcastReceiver.class); |
| PackageManager pm = context.getPackageManager(); |
| pm.setComponentEnabledSetting(receiver, state, PackageManager.DONT_KILL_APP); |
| } |
| } |