アンドロイド - AppWidgets、AlarmManagerとAsyncTask
-
16-09-2019 - |
質問
私はAlarmManager
生成された放送でアプリウィジェットを更新すると多くの幸運を持っていませんよ。ここで私は何をすべきかです。
AlarmManager
にAppWidgetProvider#onEnabled
の初期化
AlarmManager alarms = (AlarmManager) context.getSystemService(
Context.ALARM_SERVICE);
alarms.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime(), 60000, pendingIntent);
私はまた、単にAlarmManager
による解雇の更新をリッスン放送受信機を定義します。更新が発射された場合のコードは、ネットワーク呼び出しを行うAsyncTask
を実行します。 AsyncTask
が完了すると(onPostExecute
)は、ウィジェット(単数または複数)を更新するAppWidgetManager
の以前に得られたインスタンスを使用します。
ログに私は"Process com.foo.myapp (pid 12345) has died"
は別のアップデートを起動しませんその後のメッセージAlarmManager
が表示されるまで、それはすべてが実際にうまく動作します。
私はアラームを再起動しますチェックのいくつかの並べ替えを持っている必要がありますか?たとえば、ユーザーがウィジェットの親アプリにアクセスしたとき?どのように私は私のアプリは、要求の途中で死亡した場合、私は長い間実行中のタスクを完了し、ウィジェットに戻って来ることができることを保証しますか。
解決
これは更新が発射されたコードが実行されます ネットワーク呼び出しを行うAsyncTaskます。
BroadcastReceiver
の内部にある場合は、、それは動作しません。あなたがBroadcastReceiver
、およびAsyncTask
から安全にフォークのスレッドが効果的に非同期的にそのタスクを実行するためにスレッドをフォークすることはできません。
その代わり、あなたはサービスに長時間実行作業を委任する必要がありBroadcastReceiver
のアラームから開始します。