Имам 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, то все още получава излъчването, изпратено от първото копие на приложението, но в този момент данните на приложението са изтрити.
Някой има ли идея защо приложението ми ще се нулира по време на зареждане и защо излъчването се получава дори след нулиране на приложението? Това ми изглежда много странно. Рестартирането изглежда винаги идва веднага след излъчването на Motorola 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)