Повторяющийся будильник в Android ежемесячно

У меня возникают проблемы при установке повторяющегося будильника, который срабатывает в определенную дату (введенную пользователем) каждый месяц или каждые два месяца. Пока что я использую службу уведомления BroadcastReceiver вместе с ожидающим намерением. Я не могу понять:

alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY * 30*month, pendingIntent);

Как мы можем установить функцию здесь и как это повлияет на время автономной работы и есть ли какие-либо другие вещи (например, сохранение даты в базе данных и вызов ее только при срабатывании чего-либо?) И т. Д. 1. Служба уведомлений Расширение службы

public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        // Getting Notification Service
        mManager = (NotificationManager) this.getApplicationContext()
                .getSystemService(
                        this.getApplicationContext().NOTIFICATION_SERVICE);
        /*
         * When the user taps the notification we have to show the Home Screen
         * of our App, this job can be done with the help of the following
         * Intent.
         */
        Intent intent1 = new Intent(this.getApplicationContext(), com.expandablelistItems.demo.adapter.DynamicActivity.class);

        Notification notification = new Notification(R.drawable.ic_launcher,
                "Payment of your demoReminder", System.currentTimeMillis());

        intent1.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP
                | Intent.FLAG_ACTIVITY_CLEAR_TOP);

        PendingIntent pendingNotificationIntent = PendingIntent.getActivity(
                this.getApplicationContext(), 0, intent1,
                PendingIntent.FLAG_UPDATE_CURRENT);

        notification.flags |= Notification.FLAG_AUTO_CANCEL;

        notification.setLatestEventInfo(this.getApplicationContext(),
                "demo", "Payment of your demoReminder",
                pendingNotificationIntent);

        mManager.notify(0, notification);
    }

2. Способ повторения

if  (current_Month == Calendar.FEBRUARY){//for feburary month)
            GregorianCalendar cal = (GregorianCalendar) GregorianCalendar.getInstance();    
            if(cal.isLeapYear(calendar.get(Calendar.YEAR))){//for leap year feburary month  
                alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 29*month, pendingIntent);
                Toast.makeText(getActivity(), "februry", Toast.LENGTH_SHORT).show();}
            else{ //for non leap year feburary month
                Toast.makeText(getActivity(), "feb", Toast.LENGTH_SHORT).show();
                alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 28*month, pendingIntent);
            }
        }

а это широковещательный приемник

 @Override
    public void onReceive(Context context, Intent intent) {
    // When our Alaram time is triggered , this method will be excuted (onReceive)
    // We're invoking a service in this method which shows Notification to the User
     Intent myIntent = new Intent(context, NotificationService.class);
     context.startService(myIntent);
   }

Где notificationService - это первая служба расширения кода


person Bishal    schedule 04.03.2015    source источник
comment
Вам не кажется, что ваш будильник будет выключен, если ваше устройство будет выключено хотя бы раз в месяц?   -  person Lucifer    schedule 04.03.2015
comment
@Kedarnath нет. Я получил его при загрузке через широковещательный приемник   -  person Bishal    schedule 04.03.2015
comment
Это хорошо, но также я предлагаю вам использовать альтернативные способы, поскольку один месяц - это большой период времени.   -  person Lucifer    schedule 04.03.2015
comment
Именно @Kedarnath. Этот метод обязательно разрядит аккумулятор. Я тоже найду решение по вашему методу. Но я хочу, чтобы этот метод тоже работал. Итак, жду пояснений.   -  person Bishal    schedule 04.03.2015


Ответы (3)


Вам следует избегать использования SetRepeating с интервалом в 30 дней по двум причинам:

  1. Это не будет повторяться в один и тот же день каждого месяца (также потенциально может пропустить месяц).
  2. Since API 19 SetRepeating is inexact and will function like SetInexactRepeating which means potentially shifting the alarm as much as a whole interval duration (up to 30 days in your case).
    As mentioned in the docs:

    Первый срабатывание будильника произойдет не раньше запрошенного времени, но он может не сработать в течение почти полного интервала после этого времени.

Если вы хотите, чтобы будильник срабатывал именно в тот день, вы должны использовать set(int, long, PendingIntent) и вычислять следующий сигнал тревоги после каждого случая.

person Alex.F    schedule 04.03.2015
comment
Ты прав @Alex. Я ищу альтернативы, так как это может разрядить батарею, братан. Итак, я думаю о чем-то вроде режима полета в мобильных телефонах. если системная дата совпадает с установленной датой, то, возможно, можно отключить режим полета и сработать сигнализацию… что-то в этом роде. Я не знаю, как этого добиться. Но вы определенно правы. Запускать сервисы на месяц - это нехорошо - person Bishal; 04.03.2015
comment
@Bishal Я понимаю ваши опасения, но установка будильника не имеет прямого влияния на срок службы батареи (это происходит, если частота будильника становится значительной, например, каждую минуту). Кроме того, пока вы не установите флаг пробуждения, он сохранит еще больше этой драгоценной батареи. Вот официальное руководство, оно может помочь: developer.android.com/training/scheduling/alarms .html - person Alex.F; 04.03.2015
comment
ммм. Я думаю, что я яснее, чем раньше. Позвольте мне реализовать это, и я приду с манипуляциями с батареей различными методами. Вы определенно дали мне один способ сделать это. - person Bishal; 04.03.2015

По сути,

  • Вы можете инициализировать pendigIntent конкретным намерением, которое будет получать сигнал тревоги и запускать предполагаемое действие.
  • AlarmManager.INTERVAL_DAY * 30 * месяц - указывает количество месяцев (1 месяц / 2 месяца) * 30 * дневной интервал (например, 24 часа)
  • Вы можете создать такой класс, как AlarmReceiver, который будет иметь метод onReceive (), в котором вы можете выполнять свое действие.

Что касается срока службы батареи и других способов:

Один из способов - использовать класс ScheduleThreadExecutor, который выполняет несколько потоков, и с помощью AlarmManager мы можем повысить производительность.

Вместо создания экземпляра AlarmManager вы можете использовать Context.getSystemService (Context.ALARM_SERVICE), поскольку это системная служба. Это оптимизирует использование памяти и время автономной работы.

Еще одна вещь, которую вы можете использовать setInexactRepeating вместо setRepeating, эти будильники более энергоэффективны.

Для получения подробной информации посетите страницу http://developer.android.com/reference/android/app/AlarmManager.html

person Meghana M    schedule 04.03.2015
comment
Ваш метод кажется более убедительным. Вы хотите сказать, что я создаю класс с именем alarmReceiver, расширяющий BroadcastReceiver и выполняю подобные действия внутри него. Я сделал это. не могли бы вы дать мне более подробную информацию об этом - person Bishal; 04.03.2015
comment
Верно! и в классе, в который вы хотите добавить AlarmManager, необходимо создать экземпляр Intent для класса AlarmReceiver. Вы должны передать это намерение в pendingIntent, а затем вы можете использовать setInexactRepeating для запуска тревоги. Я думаю, что этого будет достаточно. - person Meghana M; 04.03.2015
comment
Вы никогда не создадите экземпляр AlarmManager, но получите его от вызова alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);. Также SetInexactRepeating не имеет ничего общего с API 19, он был введен в API 3 - person Alex.F; 04.03.2015
comment
Да @ Alex.F Вы правы, потому что на моем уровне понимания setexactRepeating имеет дело с запуском в точное время, тогда как setInexactRepeating может задерживаться, а срабатывание может варьироваться. Поправьте меня, если я ошибаюсь - person Bishal; 04.03.2015

В то время как будильник исчезнет, ​​если ваше устройство выключено. Я предлагаю вам использовать альтернативный способ запуска действия после длительного периода (например, одного месяца). Попробуйте напоминания или события календаря.

Пожалуйста, проверьте пример напоминания

Пожалуйста, проверьте пример календарного события

person Lucifer    schedule 04.03.2015