株式市場を追跡する Android アプリケーションを持っていて、価格を表示する AppWidget が付属しています。通常は正常に動作しますが、起動後の最初のロードで問題が発生しているようです。
ロード シーケンスは次のように動作するはずです。
- 電話ブーツ
- AppWidget
onUpdate
が呼び出されました。 AppWidget はインターネットからのデータを必要とし、インターネットから見積もりを取得するサービスを開始します。
Log.d("PortfolioMap", "Widget is requesting a MANUAL_UPDATE"); Intent newIntent = new Intent(context.getPackageName() + ".MANUAL_UPDATE"); context.startService(newIntent);
インターネット更新の完了時に、結果をカスタム
Application
クラスにキャッシュsendBroadcast
し、AppWidget レシーバーを起動してデータを更新します。Log.d("PortfolioMap", "Updating portfolio with results for " + updateData.size() + " stocks with value " + dbgValue); Intent newIntent = new Intent(getPackageName() + ".DATA_UPDATE_COMPLETE"); this.sendBroadcast(newIntent);
AppWidget はブロードキャストを受信し、onUpdate を呼び出して新しいデータで描画します。
public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); Log.d("PortfolioMap", "Widget received broadcast " + intent.getAction()); ... this.onUpdate(context, appWidgetManager, ids); }
実際には、ステップ 4 (DATA_UPDATE_COMPLETE ブロードキャストが送信された) とステップ 5 (DATA_UPDATE_COMPLETE ブロードキャストが受信された) の間に、アプリケーションが再起動されるまでに約 10 秒の遅延があります (onCreate
クラスApplication
はステップ 4 の後に 2 回呼び出されます)。
アプリケーションが新しい PID で再起動された後も、アプリケーションの最初のインスタンスによって送信されたブロードキャストを受信しますが、この時点でアプリケーション データは消去されています。
ロード中にアプリケーションがリセットされる理由と、アプリケーションがリセットされた後でもブロードキャストが受信される理由を知っている人はいますか? これは私には非常に奇妙に思えます。再起動は常に Motorola 放送の直後に行われるようACTION_WIDGET_ADDED
ですが、それが関連しているのか、それが何を意味するのかはわかりません。
これが私のログです。最後の 3 行で PID がどのように変化するかに注意してください。「アプリケーションが作成されています」というメッセージが 2 度目に表示されます。
21:37:55.347: D/PortfolioMap(4299): Application is being created
21:37:55.467: D/PortfolioMap(4299): Widget received broadcast android.appwidget.action.APPWIDGET_ENABLED
21:37:55.477: D/PortfolioMap(4299): Widget onUpdate called
21:37:55.477: D/PortfolioMap(4299): Widget is requesting a MANUAL_UPDATE
21:37:55.497: D/PortfolioMap(4299): InternetUpdater received broadcast MANUAL_UPDATE
21:37:55.927: D/PortfolioMap(4299): Updating portfolio with results for 3 stocks with value 8973.326
21:38:05.337: D/PortfolioMap(4299): Widget received broadcast com.motorola.blur.home.ACTION_WIDGET_ADDED
21:38:18.417: D/PortfolioMap(4778): Application is being created
21:38:18.497: D/PortfolioMap(4778): Widget received broadcast com.karwosts.PortfolioMap.DATA_UPDATE_COMPLETE
21:38:18.497: D/PortfolioMap(4778): Starting widget redraw with portfolio 'All Portfolios' (value:0.0)