ОБЩАЯ ИНФОРМАЦИЯ:
Мне нужно обновлять некоторые данные из Интернета, примерно каждый час, даже когда мое приложение закрыто.Обновление самих данных занимает от 40 секунд до 1 минуты.Затем он сохраняется как сериализуемый в файл.Этот файл читается при запуске моего приложения.
ЭТО ПОДХОД, КОТОРЫЙ Я УКАЗАЛ ДЛЯ МОМЕНТА (не пользуясь Сервисом)
, используя AlarmManager и BroadcastReceiver, например так:
private void set_REFRESH_DATA_Alarm(){
mContext = Main.this;
alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
broadcast_intent = new Intent(mContext,
RepeatingAlarmReceiver_REFRESH_DATA.class);
pendingIntent = PendingIntent.getBroadcast(mContext, 0, broadcast_intent, 0);
// do a REFRESH every hour, starting for the first time in 30 minutes from now ...
Calendar now = Calendar.getInstance();
long triggerAtTime = now.getTimeInMillis()+ (1 * 30 * 60 * 1000); // starts in 30 minutes
long repeat_alarm_every = (1 * 60 * 60 * 1000); // repeat every 60 minutes
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, triggerAtTime,
repeat_alarm_every, pendingIntent);
}
My RepeatingAlarmReceiver_REFRESH_DATA.class заботится об обновлении данных из Интернета:
public class RepeatingAlarmReceiver_REFRESH_DATA extends BroadcastReceiver {
public static Context mContext;
ConnectivityManager mConnectivity;
@Override
public void onReceive(Context context, Intent intent) {
mContext = context;
// if Network connection is OK (Wifi or Mobile) then Load data ...
mConnectivity = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
Log.i("Hub",
"mConnectivity.getNetworkInfo(0)="
+ mConnectivity.getNetworkInfo(0));
Log.i("Hub",
"mConnectivity.getNetworkInfo(1)="
+ mConnectivity.getNetworkInfo(1));
if ((mConnectivity.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED)
|| (mConnectivity.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTED)) {
Log.i("Hub", "Connectivity OK ...");
Refresh_HIST_DATA();
} else {
// else Show Dialog "No network connection" ...
Log.i("Hub",
"No network connection for the moment... will try again later!");
}
}
// =========================================================================
private void Refresh_HIST_DATA() {
Log.i("Hub", "Refresh_HIST_DATA()... Starting ...");
// etc...
}
}
В Манифесте, который у меня есть:
<receiver android:name="com.cousinHub.myapp.RepeatingAlarmReceiver_REFRESH_DATA" android:process=":remote" />
ПРОБЛЕМА:
Тревога срабатывает вовремя, и обновление начинается, но затем, примерно через 10 секунд, оно останавливается (Тайм-аут):
06-25 11: 55: 05.278: WARN / ActivityManager (76): тайм-аут широковещательной рассылки BroadcastRecord {44bb4348 null} - receive=android.os.BinderProxy@44bcc670
06-25 11: 55: 05.278: WARN / ActivityManager(76): получатель во время ожидания: ResolveInfo {44bb42c0 com.cousinHub.myapp.RepeatingAlarmReceiver_REFRESH_DATA p = 0 o = 0 m = 0x0}
06-25 11: 55: 05.278: INFO / Process (76):Отправка сигнала.PID: 819 SIG: 9
06-25 11: 55: 05.298: INFO / ActivityManager (76): процесс com.cousinHub.myapp: удаленный (pid 819) умер.
ps: как ни странно, этот «тайм-аут» не происходит примерно через 10 секунд на моем HTC Hero (все еще на Android 1.5 - API Level 4), но на моем Nexus One (2.1-обновление1)
Вопросы:
- Почему этот тайм-аут?Есть ли простой способ избежать этого?
- Правильно ли я настроил свой BroadcastReceiver в манифесте?Нужно ли что-то добавлять (чтобы избежать этого тайм-аута)?
- Должен ли я обязательно обратиться за услугами для такого рода функций "Обновить из Интернета"?(учитывая эту статью: http://www.androidguys.com/2009/09/09/diamonds-are-forever-services-are-not/) Если ДА (я должен переключиться на сервис): Любые хорошие фрагменты кода / учебник для этого ...
Как всегда, спасибо за вашу помощь.
H.