防止周末发生重复警报

时间:2015-10-15 00:22:27

标签: android alarmmanager

我有一个使用AlarmManager类的闹钟应用程序,允许用户设置一次性闹钟或重复闹钟。我想扩展功能,以便用户可以排除警报,例如,在周末。

我已将代码在周末阻止警报阻止进入AlarmReceiver.java。

  1. 我不确定AlarmReceiver.java是否是放置周末阻止警报的代码的正确位置。
  2. 我不确定我用来阻止周末闹钟的代码是否正确。基本上我告诉AlarmReceiver,如果今天是周六或周日,什么都不做。否则,请关闭警报。
  3. 设置警报的AlarmActivity.java代码:

      //Set a one time alarm
                if (repeatInterval == 0) {
                        alarmManager.set(AlarmManager.RTC, alarmTime.getTimeInMillis(), pendingIntent);
                        AlarmReceiver alarmReceiver = new AlarmReceiver(this); //http://stackoverflow.com/questions/16678763/the-method-getapplicationcontext-is-undefined
    
                        Toast.makeText(AlarmActivity.this, "Your one time reminder is now set for " + hourSet + ":" + minuteSetString + amPmlabel, Toast
                                .LENGTH_LONG)
                                .show();
                }
    
                //Set a repeating alarm
                else {
                    alarmManager.setRepeating(AlarmManager.RTC, alarmTime.getTimeInMillis(), repeatIntervalMilliseconds, pendingIntent);
                    AlarmReceiver alarmReceiver = new AlarmReceiver(this); //http://stackoverflow.com/questions/16678763/the-method-getapplicationcontext-is-undefined
    
                        Toast.makeText(AlarmActivity.this, "Your reminder is now set for " + hourSet + ":" + minuteSetString + amPmlabel + " and will " +
                                "repeat " +
                                "every " +
                                repeatInterval + " minutes.", Toast.LENGTH_LONG).show();
            }
    

    AlarmService.Java:

    package com.joshbgold.move.backend;
    
    import android.app.IntentService;
    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.content.Context;
    import android.content.Intent;
    import android.support.v4.app.NotificationCompat;
    
    import com.joshbgold.move.R;
    import com.joshbgold.move.main.AlarmActivity;
    
    public class AlarmService extends IntentService {
        private NotificationManager alarmNotificationManager;
    
        public AlarmService() {
            super("AlarmService");
        }
    
        @Override
        public void onHandleIntent(Intent intent) {
    
                sendNotification("Move reminder");
    
        }
    
        private void sendNotification(String msg) {
            alarmNotificationManager = (NotificationManager) this
                    .getSystemService(Context.NOTIFICATION_SERVICE);
    
            PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                    new Intent(this, AlarmActivity.class), 0);
    
            NotificationCompat.Builder alarmNotificationBuilder = new NotificationCompat.Builder(
                    this).setContentTitle("Reminder").setSmallIcon(R.mipmap.ic_launcher)
                    .setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
                    .setContentText(msg);
    
    
            alarmNotificationBuilder.setContentIntent(contentIntent);
            alarmNotificationManager.notify(1, alarmNotificationBuilder.build());
        }
    
    }
    

    AlarmReceiver.Java:

    package com.joshbgold.move.backend;
    
    import android.content.Context;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.preference.PreferenceManager;
    import android.support.v4.content.WakefulBroadcastReceiver;
    
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    
    public class AlarmReceiver extends WakefulBroadcastReceiver {
    
        Context myContext;
        public AlarmReceiver(Context context){
            myContext = context;
        }
    
        public AlarmReceiver(){
    
        }
    
        //get the current day
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE");
        Date date = new Date();
        String dayOfTheWeek = simpleDateFormat.format(date);
    
        Calendar calendar = Calendar.getInstance();
        int currentHour = calendar.HOUR_OF_DAY;
    
        boolean noWeekends = true;
        boolean workHoursOnly = true;
    
        @Override
        public void onReceive(final Context context, Intent intent) {
    
    
            try {  //this value could be null if user has not set it...
                noWeekends = loadPrefs("noWeekends", noWeekends);
                workHoursOnly = loadPrefs("workHoursOnly", workHoursOnly);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
    
            if(dayOfTheWeek == "Saturday" || dayOfTheWeek == "Sunday"  && noWeekends == true) {
                //Alarm is not wanted on the weekend
                try {
                    wait(1);  //waits for one-thousandth of a millisecond
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    
            else if ((currentHour < 9 || currentHour > 17)  && workHoursOnly == true){
                //Alarm outside of work hours
                try {
                    wait(1);  //waits for one-thousandth of a millisecond
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    
            else {
    
                Intent myIntent = new Intent();
                myIntent.setClassName("com.joshbgold.move", "com.joshbgold.move.main.ReminderActivity");
                myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(myIntent);
            }
        }
    
        //get prefs
        private boolean loadPrefs(String key,boolean value) {
            SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(myContext);
            boolean data = sharedPreferences.getBoolean(key, value);
            return data;
        }
    }
    

    AlarmReceiver.java(更正后的代码)

    package com.joshbgold.move.backend;
    
    import android.content.Context;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.preference.PreferenceManager;
    import android.support.v4.content.WakefulBroadcastReceiver;
    import java.util.Calendar;
    
    public class AlarmReceiver extends WakefulBroadcastReceiver {
    
        Context myContext;
        public AlarmReceiver(Context context){
            myContext = context;
        }
    
        public AlarmReceiver() {
    
        }
    
        private boolean workHoursOnly = false;
        private boolean noWeekends = false;
    
        @Override
        public void onReceive(final Context context, Intent intent) {
    
            Calendar calendar = Calendar.getInstance();
            int currentHour = calendar.get(Calendar.HOUR_OF_DAY);
            int today = calendar.get(Calendar.DAY_OF_WEEK);
            boolean isWeekend = (today == Calendar.SUNDAY) || (today == Calendar.SATURDAY);
            boolean isOutsideWorkHours = (currentHour < 9) || (currentHour > 16);
    
            //checkPrefs checks whether a preferences key exists
            if (checkPrefs("workHoursOnlyKey")){
                workHoursOnly = loadPrefs("workHoursOnlyKey", workHoursOnly);
            }
    
            if(checkPrefs("noWeekendsKey")){
                noWeekends = loadPrefs("noWeekendsKey", noWeekends);
            }
    
            /* try {  //this value could be null if user has not set it...
                workHoursOnly = loadPrefs("workHoursOnly", workHoursOnly);
            } catch (Exception e) {
                e.printStackTrace();
            }
           */
    
            /*try {  //this value could be null if user has not set it...
            noWeekends = loadPrefs("noWeekends", noWeekends);
            } catch (Exception e) {
                e.printStackTrace();
            }*/
    
            if(isWeekend && noWeekends) {
                //Alarm is not wanted on the weekend
                try {
                    Thread.sleep(1);  //waits for millisecond
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    
            else if (isOutsideWorkHours  && workHoursOnly){
                //Alarm not wanted outside of work hours
                try {
                    Thread.sleep(1);  //waits for millisecond
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    
            else {
                //Alarm is wanted, and should go off
                Intent myIntent = new Intent();
                myIntent.setClassName("com.joshbgold.move", "com.joshbgold.move.main.ReminderActivity");
                myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(myIntent);
            }
        }
    
        //check if a prefs key exists
        private boolean checkPrefs(String key){
            SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(myContext);
            boolean exists = sharedPreferences.contains(key);
            return exists;
        }
    
        //get prefs
        private boolean loadPrefs(String key,boolean value) {
            SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(myContext);
            boolean data = sharedPreferences.getBoolean(key, value);
            return data;
        }
    }
    

4 个答案:

答案 0 :(得分:7)

您的方法很好。无论如何,我建议你避免使用硬编码字符串进行周末检查 。您已经在代码中定义了Calendar对象,只需使用它:

Calendar calendar = Calendar.getInstance();
//..
int today  = calendar.get(Calendar.DAY_OF_WEEK);
boolean isWeekend = (today == Calendar.SUNDAY) || (today == Calendar.SATURDAY);

并相应地更新您的代码:

  //...
  int today  = calendar.get(Calendar.DAY_OF_WEEK);
  boolean isWeekend = (today == Calendar.SUNDAY) || (today == Calendar.SATURDAY);
  if(isWeekend && noWeekends == true) {
        //Alarm is not wanted on the weekend
        try {
            Thread.sleep(1);  
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
  //...

答案 1 :(得分:3)

除了dnellis74的答案,你还需要一些括号:

if(dayOfTheWeek == "Saturday" || dayOfTheWeek == "Sunday"  && noWeekends == true)

变为

if((dayOfTheWeek == "Saturday" || dayOfTheWeek == "Sunday")  && noWeekends == true)

我认为你不需要

 try {
      wait(1);  //waits for one-thousandth of a millisecond
     } catch (InterruptedException e) {
                e.printStackTrace();
     }

答案 2 :(得分:0)

这里完全是spitballing,我不是Android开发人员。你的星期几变量:

Date date = new Date();
String dayOfTheWeek = simpleDateFormat.format(date);

是该类的成员变量。只有在实例化类时才会设置它。如果这只发生在某种启动周期中,那么每天周末都不会改变。所以,如果我是正确的,如果你在星期三设置闹钟,这段代码将始终认为是星期三,即使是星期六。

将这两行代码移到实际函数onReceive()中,我打赌一周中的那一天会开始被拾取。

答案 3 :(得分:0)

1。)触发事件然后在订户(BroadcastReceiver)中过滤/处理它是完全正常的。这就是他们的目的。

2)。

ToArray()

注意括号修复。