背景情報:
アプリが閉じられている場合でも、約 1 時間ごとに Web からいくつかのデータを更新する必要があります。データ自体の更新には40秒~1分程度かかります。その後、Serializable としてファイルに保存されます。このファイルは、アプリの起動時に読み取られます。
これは私が今のところ取ったアプローチです(サービスを使用していません)
次のように 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: 情報/プロセス (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/ ) YES の場合 (サービスに切り替える必要があります): 適切なコード スニペット/これのチュートリアル...
いつものように、あなたの助けに感謝します.
H.