Android 小部件通过 intent 发送数据到 onRecive
Android widget send Data to onRecive via intent
我正在创建一个 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')。
感谢分配
阿维
我认为这个追加是因为你每次都覆盖了 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都是不同的...
您正在使用 PendingIntent.FLAG_UPDATE_CURRENT
,正如文档所述,“[...]如果所描述的 PendingIntent 已经存在,则保留它,但将其额外数据替换为这个新 Intent[ ...]"
因此,由于您正在尝试创建相同 class (PendingIntent
) 的多个实例,因此该标志导致了不良行为。它正在更新先前实例化的对象(您第一次调用 PendingIntent.getBroadcast(...)
方法时)并更改该对象的字段和 returns 它。这样你所有的电话都以最后一个额外的(最后 URL 你提供的)结束。
我正在创建一个 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')。
感谢分配
阿维
我认为这个追加是因为你每次都覆盖了 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都是不同的...
您正在使用 PendingIntent.FLAG_UPDATE_CURRENT
,正如文档所述,“[...]如果所描述的 PendingIntent 已经存在,则保留它,但将其额外数据替换为这个新 Intent[ ...]"
因此,由于您正在尝试创建相同 class (PendingIntent
) 的多个实例,因此该标志导致了不良行为。它正在更新先前实例化的对象(您第一次调用 PendingIntent.getBroadcast(...)
方法时)并更改该对象的字段和 returns 它。这样你所有的电话都以最后一个额外的(最后 URL 你提供的)结束。