我有一个股票市场跟踪 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 步之后第二次调用类)。
应用程序用新的 PID 重启后,它仍然会收到应用程序第一个实例发送的广播,但此时应用程序数据已被清除。
有谁知道为什么我的应用程序会在加载过程中被重置,以及为什么即使在应用程序被重置后仍会收到广播?这对我来说似乎很奇怪。重启似乎总是在摩托罗拉广播之后立即发生ACTION_WIDGET_ADDED
,但我不确定这是否相关或意味着什么。
这是我的日志。注意最后三行的 PID 是如何变化的,它第二次表示“正在创建应用程序”。
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)