2013-06-17 2 views
0

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

Для целей тестирования я сократил 30 дней до одного часа - при этом отправленный (и полученный) inital sms отправляется, но через час ничего не происходит - так что возникает проблема с повторной перезагрузкой.

P.S.

Я использую следующий пример, чтобы построить это:

How to implement yearly and monthly repeating alarms?

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

// 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); 




    } 
} 

ALARM:

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); 

} 

} 
+0

как у решена проблема? – Erum

ответ

0

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

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

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 
+0

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

+0

calendar.add (Calendar.HOUR, 1); <- этого достаточно, чтобы добавить определенное количество интервала к текущему времени. Вам не нужен календарь. – Lexandro

0

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

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

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

+0

Хорошо. (Спасибо за помощь, кстати!) Моя проблема заключается в том, что я не знаю, как уволить намерение на основе календарной даты. Если я использую эквивалент 30 дней в миллисекундах, он не будет компенсировать время, в течение которого телефон может быть отключен. (Мне просто нужно знать, как начать настройку/будильник на определенную дату - вместо выделенного промежутка времени.) – NoobDev954

+0

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

Смежные вопросы