1

我有一个股票市场跟踪 Android 应用程序,它带有一个 AppWidget 来显示价格。通常它工作正常,尽管在启动后第一次加载时似乎遇到了一些问题。

加载顺序应该像这样工作:

  1. 手机靴
  2. AppWidgetonUpdate调用。
  3. AppWidget 需要来自互联网的数据,启动一项从互联网提取报价的服务:

    Log.d("PortfolioMap", "Widget is requesting a MANUAL_UPDATE");
    Intent newIntent = new Intent(context.getPackageName() + ".MANUAL_UPDATE");
    context.startService(newIntent);
    
  4. 在互联网更新完成时,将结果缓存在自定义Application类中,触发sendBroadcastAppWidget 接收器以刷新数据。

    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 秒的延迟(onCreateApplication第 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)
4

1 回答 1

0

我在与一家主要设备制造商打交道方面有过一些经验,并且我自己也观察到了这一点。有人评论说,在系统启动时,操作系统没有足够的分配内存,并且被迫终止任何活动进程,并在完成操作系统初始化时重新分配它们。这可能很好地解释了你的观察。

于 2013-06-15T20:42:49.273 回答