AlarmManager没有按正确的时间表工作

时间:2017-04-30 14:59:00

标签: java android alarmmanager

在我的应用中,我有18 iex(9)> :global.whereis_name({:global, {:name, 1}}) :global.whereis_name({:global, {:name, 1}}) :undefined ,如果用户检查,Checkboxes将在AlarmManager指示的时间内开始通知。我只用一个警报测试了CheckBox,它运行正常。

但是,当我添加了所有日程安排时,它无法正常工作,AlarmManager会在通常的时间开始通知,通常是在关闭应用时。

方法AlarmManager中的

MainFragment.class 。这是为了保存标记的复选框,并调用将创建AlarmManager的方法。

onCreate

MainFragment.class ,这是创建闹钟的方法。

// isChecked?
        checkBoxesEvents.get(0).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                savePreferences(0);
                if(isChecked) {
                    startAlarm(0);
                }
            }
        });
        checkBoxesEvents.get(1).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                savePreferences(1);
                if(isChecked) {
                    startAlarm(1);
                }
            }
        });
        checkBoxesEvents.get(2).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                savePreferences(2);
                if(isChecked) {
                    startAlarm(2);
                }
            }
        });
        checkBoxesEvents.get(3).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                savePreferences(3);
                if(isChecked) {
                    startAlarm(3);
                }
            }
        });
        checkBoxesEvents.get(4).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                savePreferences(4);
                if(isChecked) {
                    startAlarm(4);
                }
            }
        });
        checkBoxesEvents.get(5).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                savePreferences(5);
                if(isChecked) {
                    startAlarm(5);
                }
            }
        });
        checkBoxesEvents.get(6).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                savePreferences(6);
                if(isChecked) {
                    startAlarm(6);
                }
            }
        });
        checkBoxesEvents.get(7).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                savePreferences(7);
                if(isChecked) {
                    startAlarm(7);
                }
            }
        });
        checkBoxesEvents.get(8).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                savePreferences(8);
                if(isChecked) {
                    startAlarm(8);
                }
            }
        });
        checkBoxesEvents.get(9).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                savePreferences(9);
                if(isChecked) {
                    startAlarm(9);
                }
            }
        });
        checkBoxesEvents.get(10).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                savePreferences(10);
                if(isChecked) {
                    startAlarm(10);
                }
            }
        });
        checkBoxesEvents.get(11).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                savePreferences(11);
                if(isChecked) {
                    startAlarm(11);
                }
            }
        });
        checkBoxesEvents.get(12).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                savePreferences(12);
                if(isChecked) {
                    startAlarm(12);
                }
            }
        });
        checkBoxesEvents.get(13).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                savePreferences(13);
                if(isChecked) {
                    startAlarm(13);
                }
            }
        });
        checkBoxesEvents.get(14).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                savePreferences(14);
                if(isChecked) {
                    startAlarm(14);
                }
            }
        });
        checkBoxesEvents.get(15).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                savePreferences(15);
                if(isChecked) {
                    startAlarm(15);
                }
            }
        });
        checkBoxesEvents.get(16).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                savePreferences(16);
                if(isChecked) {
                    startAlarm(16);
                }
            }
        });
        checkBoxesEvents.get(17).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                savePreferences(17);
                if(isChecked) {
                    startAlarm(17);
                }
            }
        });

AlarmReceiver.class ,这是我的public void startAlarm(int eventID) { int[] HOUR_ARRAY = {7, 20, 7,12,17 ,8,16, 8, 9,21, 9,19,12,13,13,14,15,15}; int[] MINUTES_ARRAY = {55,55,55,55,55,25,25,55,55,55,55,25,50,25,55,55,25,55}; String[] NOTIFICATION_TITLES = {"Ocleera Rift", "Ocleera Rift", "Mistmerrow Conflict", "Mistmerrow Conflict", "Mistmerrow Conflict", "Freedich Gold Trader", "Freedich Gold Trader", "Nation Construction Quests", "Diamond Shores", "Diamond Shores", "Battle of the Golden Plains", "Battle of the Golden Plains", "Karkasse Ridgelands", "Kraken", "The Mirage Isle Fish Fest", "Red Dragon", "Abyssal Attack", "Lusca Awakening"}; String notificationTitle = getString(R.string.contentTitle); String notificationText = NOTIFICATION_TITLES[eventID] + getString(R.string.contentNotificationText); Calendar calendar = Calendar.getInstance(); Log.d("HOUR-BEFORE-SET", String.valueOf(calendar.get(Calendar.HOUR_OF_DAY)) + String.valueOf(calendar.get(Calendar.MINUTE))); calendar.set(Calendar.HOUR_OF_DAY, HOUR_ARRAY[eventID]); calendar.set(Calendar.MINUTE, MINUTES_ARRAY[eventID]); Log.d("HOUR-AFTER-SET", String.valueOf(calendar.get(Calendar.HOUR_OF_DAY)) + String.valueOf(calendar.get(Calendar.MINUTE))); Intent intent = new Intent(getActivity().getApplicationContext(), AlarmReceiver.class); intent.putExtra("contentTitle", notificationTitle); intent.putExtra("contentText", notificationText); PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity().getApplicationContext(), eventID, intent, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); }

BroadcastReceiver

1 个答案:

答案 0 :(得分:0)

AlarmManager文档说明了setRepeating

  

如果声明的触发时间是过去的,则会触发警报   立即,报警数量取决于过去的距离   触发时间相对于重复间隔。

我的闹钟在错误的时间开始,因为时间已经过去了。并且与多个警报无关。

我做的调整就是把已经过去的警报放到第二天开始。

Calendar actualTime = Calendar.getInstance();
if(calendar.getTimeInMillis() < actualTime.getTimeInMillis()) {
    calendar.set(Calendar.DAY_OF_MONTH, 1);
}

我刚把它添加到我的代码中。