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

Posted

技术标签:

【中文标题】Android 小部件通过意图将数据发送到 onRecive【英文标题】:Android widget send Data to onRecive via intent 【发布时间】:2015-07-16 06:47:47 【问题描述】:

我正在创建一个 android 小部件,通过点击,小部件的每个实例都会转到不同的 url。

我在将 url 从“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");
        

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

谢谢大家

视频

【问题讨论】:

【参考方案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都是不同的……

【讨论】:

【参考方案2】:

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

因此,由于您尝试创建同一类 (PendingIntent) 的多个实例,因此该标志会导致不需要的行为。它正在更新先前实例化的对象(您第一次调用PendingIntent.getBroadcast(...) 方法)并更改该对象的字段并返回它。这样您的所有呼叫都会以最后一个额外的(您提供的最后一个 URL)结束。

【讨论】:

感谢您的详细解释

以上是关于Android 小部件通过意图将数据发送到 onRecive的主要内容,如果未能解决你的问题,请参考以下文章

Android 应用小部件实例发送相同的待处理意图

发送多种意图的小部件

ActivityNotFoundException 意图 + 小部件

发送和接收意图之间的巨大延迟

多个 Android Widget 实例仅更新最后一个小部件

Android小部件ListView项目点击不起作用