Проблем с AppWidget при зареждане (приложението се рестартира по средата на инициализацията)

Имам Android приложение за проследяване на борсата и то идва с AppWidget за показване на цените. Обикновено работи добре, въпреки че изглежда има проблеми при първото зареждане след зареждане.

Предполага се, че последователността на зареждане работи по следния начин:

  1. Ботуши за телефон
  2. AppWidget onUpdate извикан.
  3. AppWidget се нуждае от данни от интернет, стартира услуга, която извлича котировки от интернет:

    Log.d("PortfolioMap", "Widget is requesting a MANUAL_UPDATE");
    Intent newIntent = new Intent(context.getPackageName() + ".MANUAL_UPDATE");
    context.startService(newIntent);
    
  4. При завършване на актуализацията по интернет, кеширайте резултата в персонализиран 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); 
    
  5. 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)

person Tim    schedule 10.01.2013    source източник


Отговори (1)


Имам известен опит в това да се занимавам с голям производител на устройства и сам наблюдавах това. Беше коментирано, че при зареждане на системата операционната система няма достатъчно разпределена памет и е принудена да убие всички активни процеси, преразпределяйки ги, когато и когато завърши инициализирането на операционната система. Това може добре да обясни вашите наблюдения.

person user2393467    schedule 15.06.2013