我需要知道onReceive()中的widget ID。 我想将配置活动的选定项目信息与新的窗口小部件ID相关联,然后将它们保存到共享偏好中,这样我就可以通过读取共享偏好来了解onReiceive()内部要做什么
配置活动:
resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetId);
setResult(RESULT_CANCELED, resultValue);
listView.setOnItemClickListener(new OnItemClickListener()
{
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)
{
...
resultValue.putExtra("mykey", "otherinfo");
setResult(RESULT_OK, resultValue);
finish();
}
});
的AppWidgetProvider:
@Override
public void onEnabled(Context context)
{
super.onEnabled(context);
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
int id = intent.getStringExtra(AppWidgetManager.EXTRA_APPWIDGET_ID) // <-- THIS IS NULL!
// save id on shared preferences
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
am.setInexactRepeating(AlarmManager.RTC, System.currentTimeMillis(), UPDATE_INTERVAL, pi);
}
广播接收器:
public void onReceive(Context context, Intent intent)
{
intent.getStringExtra(AppWidgetManager.EXTRA_APPWIDGET_ID); // <-- NULL
..
}
getStringExtra总是返回空值......也许上面的代码是完全错误的
答案 0 :(得分:1)
一些事情......
onEnabled
仅在添加第一个appwidget时调用一次(即当此AppWidgetProvider变为“启用”时)。请注意,onEnabled没有为您提供appWidgetId
- 它不是与主屏幕上的app小部件的特定实例相关联的回调。getStringExtra(AppWidgetManager.EXTRA_APPWIDGET_ID)
。我想你打算打电话给putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId)
。但是,如上所述,由于您未在onEnabled()
中获得ID,因此无法使用此功能。如果要在主屏幕上设置与每个appwidget实例关联的警报,则需要做一些额外的工作。
appWidgetId
存储在SharedPreferences中(例如,您可以使用密钥“appwidgetid _ ##”来存储布尔值)。onUpdate()
并且您正在迭代appWidgetIds
数组时,首先检查SharedPreferences中的每个appWidgetId
。如果检查通过,您知道用户已配置该appWidget,您可以为其创建和设置警报;否则,continue
到下一个appWidgetId
。Intent
s在创建PendingIntent
时必须是唯一的,否则您将获得重用或覆盖旧PendingIntent
的{{1}}(具体取决于哪个)您指定为PendingIntent
调用的最后一个参数的标志。由于在检查唯一性时不考虑额外内容,请参阅底部的代码,了解如何使其唯一。onDelete()
中,取消该appwidget的闹钟。确保以完全相同的方式构造PendingIntent。您也可以在此处从SharedPreferences中删除appWidgetId
。使意图独特:
Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWIdgetId);
// IMPORTANT!
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
// Note the FLAG_UPDATE_CURRENT
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = ...
am.setInexactRepeating(...);