Android小部件未更新 - 具有不正确的小部件ID

11

我一直在开发一个小部件,取得了一些进展(希望如此),但仍然无法让它按我的意愿运行。

我有一个可配置的活动,它可以正常工作。 关闭活动时,我会调用WordWidget类中的updateAppWidget方法,然后小部件会更新随机数。

因为onClick事件,我无法改变随机数。 根据日志,我确实进入了onReceive()方法,但只是这样。

在日志中,我打印小部件ID。 我注意到,当从可配置的活动运行时,它会打印appWidgetId = 33,但当我按小部件时,它会打印appWidgetId = 24。

这是代码:

public class WordWidget extends AppWidgetProvider
{

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
    {
        //This is run when a new widget is added or when the update period expires.
        Log.v("wotd",  "In onUpdate(), updating " + appWidgetIds.length + " widgets");
        Log.v("wotd",  "   the array is " + appWidgetIds.toString());

        for(int x = 0; x < appWidgetIds.length; x++)
        {
            Integer appWidgetId = appWidgetIds[x];


            //Method that updates the random value
            updateAppWidget(context, appWidgetManager, appWidgetId);
        }
    }

    @Override
    public void onReceive(Context context, Intent intent)
    {
        super.onReceive(context, intent);
        Log.v("wotd", "In onReceive() with intent=" + intent.toString());
        if (intent.getAction().equals("android.appwidget.action.APPWIDGET_UPDATE"))
        {
            Integer mAppWidgetId;
            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

            Bundle extras = intent.getExtras();
            if(extras != null)
            {
                Log.v("wotd", "In onReceive(), extras is valid");
                mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);

                //If they gave us an intent without a valid widget Id, just bail.
                if (mAppWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID)
                {
                    Log.v("wotd", "In onReceive(), mAppWidgetId is ok");
                    updateAppWidget(context, appWidgetManager, mAppWidgetId);
                }
            } else
            {
                Log.v("wotd", "In onReceive(), extras is INVALID");
                mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
            }
        }


    }


    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, Integer appWidgetId)
    {
        Log.v("wotd", "In updateAppWidget() with appWidgetId=" + appWidgetId);

        //Setup onClick
        Intent widgetIntent = new Intent(context, WordWidget.class);
        widgetIntent.setAction("android.appwidget.action.APPWIDGET_UPDATE");
        widgetIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
        PendingIntent widgetPendingIntent = PendingIntent.getBroadcast(context, 0, widgetIntent, 0);

        Integer nextNumb = new Random().nextInt(100);
        Log.v("wotd", "In updateAppWidget(), nextNumb = " + nextNumb.toString());

        RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.widgetlayout);
        remoteView.setTextViewText(R.id.mainText, String.valueOf(nextNumb));
        remoteView.setOnClickPendingIntent(R.id.mainText, widgetPendingIntent);

        // Tell the widget manager
        appWidgetManager.updateAppWidget(appWidgetId, remoteView);
    }
}

这是日志文件,记录了我触摸小部件的时间(请注意,首选项活动还有一个日志打印输出,并显示小部件ID为不同的数字):

05-14 17:15:47.453: V/wotd(1585): In onReceive() with intent=Intent { act=android.appwidget.action.APPWIDGET_UPDATE flg=0x10000000 cmp=com.rfxlabs.wordofthedaywidget/.WordWidget bnds=[202,177][222,201] (has extras) }
05-14 17:15:47.453: V/wotd(1585): In onReceive(), extras is valid
05-14 17:15:47.463: V/wotd(1585): In onReceive(), mAppWidgetId is ok
05-14 17:15:47.463: V/wotd(1585): In updateAppWidget() with appWidgetId=24

05-14 17:15:47.463: V/wotd(1585): 在updateAppWidget()中,nextNumb = 42。

可以看到,我实际上正在进入我的updateAppWidget方法,但出现了一些问题,appWidgetId不正确。

有什么想法是为什么会发生这种情况吗?非常感谢!


你想要更新小部件的问题是因为小部件被点击了还是其他原因? - ρяσѕρєя K
是的,我希望每次触摸小部件时随机数都会改变。 - Sandy
你确定你没有两份代码只是有轻微的差别吗? - Ron
我不理解你的评论。你能换个说法吗? - Sandy
3个回答

25

在你的函数 updateAppWidget 中,转到这一行:

PendingIntent widgetPendingIntent = PendingIntent.getBroadcast(context, 0, widgetIntent, 0);

...并将其更改为:

PendingIntent widgetPendingIntent = PendingIntent.getBroadcast(context, appWidgetId, widgetIntent, 0);

Java文档明确说明第二个参数(请求代码)未被使用。 - Jeffrey Blattman
它能工作!不知道为什么。有人能解释一下这行代码里发生了什么神奇的事情吗? - deviant
3
没有什么魔法,只是为了设计需要让PendingIntents唯一而已。使用小部件ID作为请求码可以帮助区分一个实例和另一个实例。 - Jose_GD

0

在getBroadcast中,您需要设置一个last标志:PendingIntent.FLAG_UPDATE_CURRENT


0

要在触摸时更新您的主屏幕小部件,您需要在清单中注册自定义广播接收器,并将其作为操作添加到小部件:

步骤1:注册自定义接收器:

<intent-filter>
<action android:name="com.imrankhanandroid.HomeWidgetRandomNum.ACTION_WIDGET_RANDOM"/>
</intent-filter>

步骤2:在您的小部件类中添加以下操作以将其布局:

public void onReceive(Context paramContext, Intent paramIntent)
    {
        //Intent
         String str = paramIntent.getAction();
         if (paramIntent.getAction().equals(ACTION_WIDGET_RANDOM)) {
             updateWidgetState(paramContext, str);   
         }
         else
            {
              super.onReceive(paramContext, paramIntent);
            }
    }

步骤 3:在您的 updateWidgetState 中将新操作添加到 Intent 中,如下所示:

rview = new RemoteViews(paramContext.getPackageName(), R.layout.widget_layoutmain);
Intent active = new Intent(paramContext, Randomnuberwidget.class);
active.setAction(ACTION_WIDGET_RANDOM);
PendingIntent actionPendingIntent = PendingIntent.getBroadcast(paramContext, 0, active, 0);
rview.setOnClickPendingIntent(R.id.ImageView_gps, actionPendingIntent);

最后你可以从这里下载一个工作的HomeWidget示例 HomeWidgetRendomNumber,每次点击都会生成一个随机数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接