Мое приложение должно отправить некоторые данные в удаленную базу данных. Проблема в том, что иногда отсутствует доступ к интернету (например, нет сигналов 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!");
}
};
}
Как я понимаю, другим возможным подходом является использование Сервиса. Так вот мой
Вопросы
- Это правильный подход?
- Возможно ли убрать тревоги из приемника? Если да, то как я могу это сделать?
- Должен ли я использовать AsyncTask в приемнике для отправки данных или это можно сделать из основного цикла?
Спасибо!