将小部件ID传递给活动

时间:2011-09-02 22:41:18

标签: android android-widget

在我的小部件提供程序中,我有以下代码:

for (int widget_id : appWidgetIds) {
  Log.d(TAG, "Widget Id: " + widget_id);
  RemoteViews remoteViews;

  Widget widget;

  while (true) {
    try {
      widget = Widget.load(context, Widget.class, widget_id);
      break;
    }
    catch (Exception ex) {
      Log.e(TAG, "Exception!", ex);
    }
  }

  // Widget is assigned to user
  if (widget != null) {
    remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_with_user);
    remoteViews.setCharSequence(R.id.user_text, "setText", widget.user.name);
    remoteViews.setUri(R.id.avatar, "setImageURI", Uri.parse(widget.user.avatar));
  }
  else {
    remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);
    Intent configIntent = new Intent(context, ConfigureWidget.class);
    configIntent.setAction(ACTION_WIDGET_CONFIGURE);
    configIntent.putExtra("widget_id", widget_id);

    PendingIntent configPendingIntent = PendingIntent.getActivity(context, REQUEST_CODE_ONE, configIntent, 0);
    remoteViews.setOnClickPendingIntent(R.id.configure_text, configPendingIntent);
  }

  appWidgetManager.updateAppWidget(widget_id, remoteViews);
}

在else部分中,我正在启动配置活动并尝试将小部件ID传递给它。但是,bundle总是为null:

Bundle extras = getIntent().getExtras();

if (extras != null) {
  int widget_id = extras.getInt("widget_id");
}

如何将小部件ID添加到已启动的活动中?

4 个答案:

答案 0 :(得分:5)

问题在于android使用PendingIntents进行缓存。解决方案是添加FLAG_UPDATE_CURRENT标志,使其更新缓存的PendingIntent。

PendingIntent configPendingIntent = PendingIntent.getActivity(context, REQUEST_CODE_ONE, configIntent, PendingIntent.FLAG_UPDATE_CURRENT);

Source

答案 1 :(得分:1)

请尝试使用以下代码:

if (extras != null) {
  int widget_id = getIntent().getIntExtra("widget_id", defaultValue);
}

答案 2 :(得分:1)

<击>

<击>
  

public Bundle getExtras()
  从意图中检索扩展数据的地图。

Source

同样适用于Intent.putExtra(Bundle)。这些是扩展属性。
请尝试使用getIntent().getIntExtra(String key, int defaultValue)

答案 3 :(得分:1)

您确定在清单中正确注册了意图过滤器吗?出于某种原因,如果没有明确的操作,额外内容就无法正常传递,如果您没有设置意图过滤器,它可能无法正常工作。