Android小部件通过intent将数据发送到onRecive

时间:2015-05-06 08:36:56

标签: android android-intent android-widget

我正在创建一个Android小部件,通过点击,小部件的每个实例都会转到另一个网址。

我在将'onUpdate'中的网址发送到'onReceive'方法时遇到了问题。

onUpdate代码:

 List<String> urls = Arrays.asList("google.com", "yahoo.com", "bing.com", "msn.com");

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

    int cnt = 0;

    // Get all ids
    ComponentName thisWidget = new ComponentName(context,MyWidgetProvider.class);
    int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
    for (int widgetId : allWidgetIds) {
        // create some random data

        RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.widget_layout);
        Log.w("WidgetExample", urls.get(cnt));
        // Set the text
        remoteViews.setTextViewText(R.id.urlData, urls.get(cnt));

        // Register an onClickListener
        Intent intent = new Intent(context, MyWidgetProvider.class);

        intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
        intent.putExtra("url",urls.get(cnt));

        PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteViews.setOnClickPendingIntent(R.id.open, pendingIntent);
        appWidgetManager.updateAppWidget(widgetId, remoteViews);

        cnt++;
    }
}

onReceive代码:

 @Override
public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);

    String TAG = "onReceive";

        Bundle extras = intent.getExtras();
        if(extras!=null) {
            String url = extras.getString("url");
            Log.d(TAG, "url is : "+url);
        }else {
            Log.d(TAG, "no url");
        }
}

问题是我得到了相同的网址(列表中的最后一个网址 - 'msn.com')。

感谢分享

阿维

2 个答案:

答案 0 :(得分:1)

我认为这是追加的,因为你每次都会覆盖PendingIntent中的意图存储,因为requestCode没有改变。

PendingIntent pendingIntent = PendingIntent.getBroadcast(context,**0**, intent, PendingIntent.FLAG_UPDATE_CURRENT);

如果要设置更多PendingIntent,则必须更改requestCode(在您的情况下为0)

尝试

 PendingIntent pendingIntent = PendingIntent.getBroadcast(context, cnt, intent, PendingIntent.FLAG_UPDATE_CURRENT);

通过这种方式,所有PendingIntents都不同......

答案 1 :(得分:1)

你正在使用PendingIntent.FLAG_UPDATE_CURRENT,正如文档所述,“[...]如果所描述的PendingIntent已经存在,那么保留它,但用这个新Intent中的内容替换它的额外数据[.. 。]“

因此,当您尝试创建同一类(PendingIntent)的多个实例时,该标志会导致不需要的行为。它正在更新先前实例化的对象(第一次调用PendingIntent.getBroadcast(...)方法)并更改该对象的字段并将其返回。这样你的所有电话都会收到最后一个额外的信息(你提供的最后一个网址)。