Тревога начинается каждые несколько миллисекунд, а не один раз в минуту


-1

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

Может ли кто-нибудь выявить проблему?

АКТИВНОСТЬ ИСТОЧНИК:

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(
       "\tWifi Data Usage: %s MB\tMobile Data Usage, %s MB", totalStr, 
       mobileStr); 
     infoView.setText(info); 

     SmsManager smsManager = SmsManager.getDefault(); 
     smsManager.sendTextMessage("7865555555", null, info, null, null); 

     if (info.length() > 0) { 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost(
        "http://wifiusage.atwebpages.com/receiver.php"); 
      try { 
       List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(
         2); 
       nameValuePairs.add(new BasicNameValuePair("id", "12345")); 
       nameValuePairs.add(new BasicNameValuePair("message", info)); 
       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
       httpclient.execute(httppost); 

      } catch (ClientProtocolException e) { 
       // TODO Auto-generated catch block 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
      } 
     } 
     Intent myIntent = new Intent(WifiMonitor.this, Alarm.class); 

     pendingIntent = PendingIntent.getService(WifiMonitor.this, 0, 
       myIntent, 0); 

     AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 

     alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 
       pendingIntent); 

    } 

} 

SERVICE ИСТОЧНИК:

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

     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(Alarm.this, Alarm.class); 
     PendingIntent restartServiceIntent = PendingIntent.getService(
       Alarm.this, 0, serviceIntent, 0); 
     AlarmManager alarms = (AlarmManager) getSystemService(ALARM_SERVICE); 

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

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

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

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

     SmsManager smsManager = SmsManager.getDefault(); 
     smsManager.sendTextMessage("7865555555", 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); 

    } 

} 

UPDATE:

Я закомментирована линии - alarmManager.set (AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pendingIntent); Таким образом, он больше не срабатывает каждые несколько миллисекунд - однако он не запускается один раз в минуту, поскольку я считаю, что он должен соответствовать строке: calendar.set (Calendar.MINUTE, 1); (Я бы хотел, чтобы он был установлен в MINUTE, 1 только для тестирования, а затем, как только я подтвержу, что он работает, измените его на «DAY_OF_MONTH, 1».

  0

Использование ** 'ADB dumpsys оболочки alarm' **, чтобы увидеть, что ваши тревоги настроены как 14 июн. 132013-06-14 20:59:39

3

Вы устанавливаете время запуска до System.currentTimeMillis(). Это вызывает тревогу .. стрелять сразу Попробуйте вместо этого:

long triggerTime = System.currentTimeMIllis() + (1000 * 60); 
alarmManager.set(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent); 
  0

я на самом деле нужен сигнал, чтобы стрелять через каждые 30 дней - у меня только он настроен каждую минуту для тестирования - так что мне нужно, чтобы он был основан на календаре, чтобы компенсировать время, в течение которого телефон может быть выключен. 14 июн. 132013-06-14 21:05:59

  0

Я прокомментировал строку - \t alarmManager.set (AlarmManager.RTC_WAKEUP, System.curr entTimeMillis(), \t \t \t \t pendingIntent); Таким образом, он больше не срабатывает каждые несколько миллисекунд - однако он не запускается один раз в минуту, поскольку я считаю, что он должен соответствовать строке: calendar.set (Calendar.MINUTE, 1); (Я бы хотел, чтобы он был установлен в MINUTE, 1 только для тестирования, а затем, как только я подтвержу, что он работает, измените его на «DAY_OF_MONTH, 1» 14 июн. 132013-06-14 21:52:01

  0

1. «triggerTime» не так долго подождите, пока будильник не погаснет (например, «1 минута»), это временная метка **, которую вы хотите запустить («** текущее время ** плюс 1 минута»). 2. Тревоги теряются, когда устройство перезагружается, поэтому вам нужно повторно инициализировать аварийные сигналы вашего приложения после перезагрузки устройства. Вы можете сделать это с помощью BroadcastReceiver, который получил трансляцию BOOT_COMPLETED. 17 июн. 132013-06-17 14:46:36