从BroadcastReceiver获取小部件ID

时间:2013-08-14 14:39:11

标签: android widget broadcastreceiver

我需要知道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总是返回空值......也许上面的代码是完全错误的

1 个答案:

答案 0 :(得分:1)

一些事情......

    AppWidgetProvider中的
  1. onEnabled仅在添加第一个appwidget时调用一次(即当此AppWidgetProvider变为“启用”时)。请注意,onEnabled没有为您提供appWidgetId - 它不是与主屏幕上的app小部件的特定实例相关联的回调。
  2. 您正在为刚刚创建的Intent调用getStringExtra(AppWidgetManager.EXTRA_APPWIDGET_ID)。我想你打算打电话给putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId)。但是,如上所述,由于您未在onEnabled()中获得ID,因此无法使用此功能。
  3. 如果要在主屏幕上设置与每个appwidget实例关联的警报,则需要做一些额外的工作。

    1. 完成配置应用小部件后,将其appWidgetId存储在SharedPreferences中(例如,您可以使用密钥“appwidgetid _ ##”来存储布尔值)。
    2. 当调用onUpdate()并且您正在迭代appWidgetIds数组时,首先检查SharedPreferences中的每个appWidgetId。如果检查通过,您知道用户已配置该appWidget,您可以为其创建和设置警报;否则,continue到下一个appWidgetId
    3. 设置闹钟时,请注意Intent s在创建PendingIntent时必须是唯一的,否则您将获得重用或覆盖旧PendingIntent的{​​{1}}(具体取决于哪个)您指定为PendingIntent调用的最后一个参数的标志。由于在检查唯一性时不考虑额外内容,请参阅底部的代码,了解如何使其唯一。
    4. onDelete()中,取消该appwidget的闹钟。确保以完全相同的方式构造PendingIntent。您也可以在此处从SharedPreferences中删除appWidgetId
    5. 使意图独特:

      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(...);