背景资料:
即使我的应用程序关闭,我也需要大约每小时左右更新一次网络上的一些数据。数据本身的更新大约需要 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);
}
我的RepeatingAlarmReceiver_REFRESH_DATA.class负责从 Web 更新数据:
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} 超时-receiver=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:remote (pid 819) 已经死亡。
ps:奇怪的是,这个“超时”在我的 HTC Hero(仍然在 Android 1.5 - API 级别 4 上)大约 10 秒后不会发生,但在我的 Nexus One(2.1-update1)上很好
问题 :
- 为什么这个超时?有什么简单的方法可以避免这种情况吗?
- 我是否在清单中正确设置了我的 BroadcastReceiver ?我需要添加一些东西(以避免这种超时)吗?
- 我绝对应该为这种“从 Web 刷新”功能寻求服务吗?(考虑这篇文章:http ://www.androidguys.com/2009/09/09/diamonds-are-forever-services-are-not/ )如果是(我应该切换到服务):任何好的代码片段/本教程...
一如既往,感谢您的帮助。
H。