Java tutorial
/* * Copyright 2014 istvank.eu * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.istvank.apps.lenslog.receivers; import android.annotation.TargetApi; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.os.Build; import android.preference.PreferenceManager; import android.support.v4.content.WakefulBroadcastReceiver; import java.util.Calendar; import eu.istvank.apps.lenslog.fragments.SettingsFragment; import eu.istvank.apps.lenslog.services.NotifySchedulingService; /** * When the alarm fires, this WakefulBroadcastReceiver receives the broadcast Intent * and then starts the IntentService {@code NotifySchedulingService} to do some work. */ public class NotifyAlarmReceiver extends WakefulBroadcastReceiver { // The app's AlarmManager, which provides access to the system alarm services. private AlarmManager alarmMgr; // The pending intent that is triggered when the alarm fires. private PendingIntent alarmIntent; @Override public void onReceive(Context context, Intent intent) { Intent service = new Intent(context, NotifySchedulingService.class); // Start the service, keeping the device awake while it is launching. startWakefulService(context, service); } /** * Sets a repeating alarm that runs once a day at approximately 8:30 a.m. When the * alarm fires, the app broadcasts an Intent to this WakefulBroadcastReceiver. * @param context */ @TargetApi(Build.VERSION_CODES.KITKAT) public void setAlarm(Context context) { alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, NotifyAlarmReceiver.class); alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0); // get notification time from preferences SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); long notificationTime = sp.getLong(SettingsFragment.KEY_PREF_NOTIFICATION_TIME, 50400000); Calendar calendar = Calendar.getInstance(); //TODO: if the time has passed already, set it to tomorrow. calendar.setTimeInMillis(notificationTime); // The following line is for debug only //alarmMgr.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), alarmIntent); // Set the alarm to fire according to the device's clock, and to repeat once a day. alarmMgr.setInexactRepeating(AlarmManager.RTC, notificationTime, AlarmManager.INTERVAL_DAY, alarmIntent); // Enable {@code SampleBootReceiver} to automatically restart the alarm when the // device is rebooted. ComponentName receiver = new ComponentName(context, NotifyAlarmReceiver.class); PackageManager pm = context.getPackageManager(); pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); } /** * Cancels the alarm. * @param context */ public void cancelAlarm(Context context) { // If the alarm has been set, cancel it. if (alarmMgr != null) { alarmMgr.cancel(alarmIntent); } // Disable {@code SampleBootReceiver} so that it doesn't automatically restart the // alarm when the device is rebooted. ComponentName receiver = new ComponentName(context, BootReceiver.class); PackageManager pm = context.getPackageManager(); pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); } }