реализация ежемесячно повторяющихся сигналов тревоги

У меня есть будильник, который мне нужно выполнять каждые 30 дней. Чтобы избежать проблем с отключением телефона, я решил, что это должно быть основано на календаре. То, как я пытаюсь его спроектировать, - это когда приложение открыто - оно отправляет данные об использовании Wi-Fi через sms. Затем, в зависимости от даты первого запуска, сигнал тревоги будет запускаться снова через 30 дней с этой даты.

В целях тестирования я сократил 30 дней до одного часа - начальное смс отправляется (и принимается), однако через час - ничего не происходит - поэтому похоже, что у повторяющегося будильника есть проблемы.

P.S.

Я использую следующий пример для создания этого:

Как реализовать ежегодные и ежемесячные повторяющиеся сигналы тревоги?

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

// schedule alarm for today + 1 day
    Calendar calendar = Calendar.getInstance();
    calendar.add(Calendar.DATE, 1);

Что, кажется, добавляет время к фактическому времени, которое я получаю из календаря, вместо того, чтобы добавлять время к тому, когда должен быть выполнен будильник (спасибо, Лександро, за то, что помог указать на это.), но я все еще не могу заставить будильник выполняться на основе определенного количества часов (или дней) от текущего времени.

ИСТОЧНИК:

public class WifiMonitor extends Activity {

    Button sendButton;

    EditText msgTextField;

    private PendingIntent pendingIntent;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView infoView = (TextView) findViewById(R.id.traffic_info);

        double totalBytes = (double) TrafficStats.getTotalRxBytes()
                + TrafficStats.getTotalTxBytes();
        double mobileBytes = TrafficStats.getMobileRxBytes()
                + TrafficStats.getMobileTxBytes();
        totalBytes -= mobileBytes;
        totalBytes /= 1000000;
        mobileBytes /= 1000000;

        NumberFormat nf = new DecimalFormat("#.##");
        String totalStr = nf.format(totalBytes);
        String mobileStr = nf.format(mobileBytes);
        String info = String.format(
                "Wifi Data Usage: %s MB\tMobile Data Usage: %s MB", totalStr,
                mobileStr);
        infoView.setText(info);

        SmsManager smsManager = SmsManager.getDefault();
        smsManager.sendTextMessage("7862611848", null, info, null, null);
        String alarm = Context.ALARM_SERVICE;

        AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Calendar calendar = Calendar.getInstance();
        calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_WEEK, 0);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 1);
        calendar.set(Calendar.SECOND, 0);

        Intent Aintent = new Intent("REFRESH_THIS");
        PendingIntent pi = PendingIntent.getBroadcast(this, 0, Aintent, 0);
        am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                AlarmManager.INTERVAL_DAY, pi);

        // reschedule to check again tomorrow
        Intent serviceIntent = new Intent(WifiMonitor.this, Alarm.class);
        PendingIntent restartServiceIntent = PendingIntent.getService(
                WifiMonitor.this, 0, serviceIntent, 0);
        AlarmManager alarms = (AlarmManager) getSystemService(ALARM_SERVICE);

        // cancel previous alarm
        alarms.cancel(restartServiceIntent);

        // schedule alarm to run again
        calendar.add(Calendar.HOUR, 1);

        // schedule the alarm
        alarms.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                restartServiceIntent);




    }
}

ТРЕВОГА:

public class Alarm extends Service {

// compat to support older devices
@Override
public void onStart(Intent intent, int startId) {
    onStartCommand(intent, 0, startId);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    // check to ensure everything is functioning

    Toast toast = Toast.makeText(this, "WiFi Usage Sent", 2000);
    toast.show();

    // send SMS
    String sms = "";
    sms += ("\tWifi Data Usage: "
            + (TrafficStats.getTotalRxBytes()
                    + TrafficStats.getTotalTxBytes() - (TrafficStats
                    .getMobileRxBytes() + TrafficStats.getMobileTxBytes()))
            / 1000000 + " MB");

    SmsManager smsManager = SmsManager.getDefault();
    smsManager.sendTextMessage("7862611848", null, sms, null, null);

    return START_STICKY;
}

@Override
public void onCreate() {

    // TODO Auto-generated method stub
}

@Override
public IBinder onBind(Intent intent) {

    // TODO Auto-generated method stub

    return null;

}

@Override
public boolean onUnbind(Intent intent) {

    // TODO Auto-generated method stub

    return super.onUnbind(intent);

}

}

person NoobDev954    schedule 17.06.2013    source источник
comment
как вы решили проблему?   -  person Erum    schedule 31.01.2015


Ответы (2)


В области установки календаря вы получаете экземпляр с фактической датой, а затем меняете его значение, но не добавляете или вычитаете какой-то отрезок времени. Его значение полностью отличается от ожидаемого, потому что вы устанавливаете абсолютные значения, а не относительные.

Я только что извлек изменения календаря из вашего кода и выполнил, чтобы продемонстрировать:

Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime());
calendar.set(Calendar.DAY_OF_WEEK, 0);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 1);
calendar.set(Calendar.SECOND, 0);
System.out.println(calendar.getTime());
calendar.add(Calendar.HOUR, 1);
System.out.println(calendar.getTime());

результат:

Mon Jun 17 18:00:56 CEST 2013
Sat Jun 22 00:01:00 CEST 2013
Sat Jun 22 01:01:00 CEST 2013
person Lexandro    schedule 17.06.2013
comment
Я ценю, что вы указали на проблему ... каким-либо образом вы (или кто-либо другой в этом отношении) могли бы указать мне, как решить эту проблему? Примерный метод реализации ежемесячных сигналов тревоги, похоже, не работает в моем случае. - person NoobDev954; 18.06.2013
comment
calendar.add(Календарь.ЧАС, 1); ‹- этого достаточно, чтобы добавить определенное количество интервалов к текущему времени. Вам не нужен календарь.набор... вещей. - person Lexandro; 18.06.2013

Из API календаря для метода getInstance():

Получает календарь, используя часовой пояс и языковой стандарт по умолчанию. Возвращаемый календарь основан на текущем времени в часовом поясе по умолчанию с языковым стандартом по умолчанию.

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

person Bru2rat7    schedule 17.06.2013
comment
Ok. (Кстати, спасибо за вашу помощь!) Моя проблема в том, что я не знаю, как запустить намерение на основе даты календаря. Если я использую эквивалент 30 дней в миллисекундах, это не компенсирует время, когда телефон может быть выключен. (Мне просто нужно знать, как запустить намерение/будильник на основе определенной даты, а не выделенного времени.) - person NoobDev954; 18.06.2013
comment
Я думаю, мне нужно будет реализовать общие настройки для сохранения значения даты при первом запуске приложения, а затем запустить намерение на основе данных общих настроек - я просто не могу найти пример того, как это можно сделать. - person NoobDev954; 18.06.2013