AlarmManager и BroadcastReceiver: это правильный подход?(нужно повторять задание каждые X минут) - PullRequest
1 голос
/ 19 сентября 2011

Мое приложение должно отправить некоторые данные в удаленную базу данных. Проблема в том, что иногда отсутствует доступ к интернету (например, нет сигналов Wi-Fi и GSM). В этом случае я сохраняю данные в локальном хранилище и хочу отправить их, если подключение к Интернету установлено.

Для этого я планирую использовать AlarmManager и BroadcastReceiver: каждые X минут вызывать тревогу и проверять, доступен ли интернет в приемнике. Затем, если Интернет доступен, я хочу отправить отложенные данные в базу данных и удалить аварийные сигналы.

В моей основной деятельности я использую этот код для настройки сигналов тревоги

private void setCheckAlarm(){
    alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

    broadcast_intent = new Intent(Context, SendData.class);
    pendingIntent = PendingIntent.getBroadcast(Context, 0,  broadcast_intent, 0);

    // check for internet every 5 minutes, starting for the first time in 1 minute from now
    // this intervals only for testing and debug purpose
    Calendar now = Calendar.getInstance();
    long triggerAtTime = now.getTimeInMillis()+ (1 * 60 * 1000);   // 1 minute
    long repeat_alarm_every = (1 * 5 * 60 * 1000);                // repeat every 5 minutes
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, triggerAtTime, repeat_alarm_every, pendingIntent);
}

а вот приемник, который проверяет интернет и отправляет данные

public class SendData extends BroadcastReceiver {
  ConnectivityManager mConnectivity;

  @Override
  public void onReceive(Context context, Intent intent) {
    // if Network connection is OK (Wifi or Mobile) then insert data ...
    mConnectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    Log.i("SendData", "mConnectivity.getNetworkInfo(0)="+mConnectivity.getNetworkInfo(0));
    Log.i("SendData", "mConnectivity.getNetworkInfo(1)="+mConnectivity.getNetworkInfo(1));
    if ((mConnectivity.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED)||( mConnectivity.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTED)) { 
      Log.i("SendData","Connectivity OK ...");
      // insert data from local storage into remote db
      // maybe using AsyncTask?
      ...
      // when finished remove alarms and exit
      ...
    } else {
      // else exit and wait for next alarm
      Log.i("SendData", "No network connection for the moment... will try again later!");
    }
  };
}

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

Вопросы

  1. Это правильный подход?
  2. Возможно ли убрать тревоги из приемника? Если да, то как я могу это сделать?
  3. Должен ли я использовать AsyncTask в приемнике для отправки данных или это можно сделать из основного цикла?

Спасибо!

1 Ответ

0 голосов
/ 19 сентября 2011

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

ЕстьХорошо, напишите об этом здесь .Документация, как правило, довольно сложна для понимания, и пример объединяет некоторые другие вещи с примером основного поставщика синхронизации (т. Е. Реализует ваш собственный поставщик проверки подлинности и расширяет контакты, ни один из которых вам не нужен, это звучит как), но как только вы удаляете егодо минимума это достаточно просто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...