onReceive将始终收到最后一个appWidgetId,甚至正在按下不同的实例窗口小部件

Che*_*eng 1 android

我有以下代码.我试图在我的主屏幕上放置2个小部件实例.

这是在放置2个小部件实例后打印的日志.

onUpdate START
onUpdate 170
onUpdate START
onUpdate 171
Run Code Online (Sandbox Code Playgroud)

当我点击第一个小部件,然后点击第二个小部件时,我预计将分别打印170和171.但是,这就是我得到的.

onReceive 171  <-- I'm expecting 170 to be printed.
onReceive 171
Run Code Online (Sandbox Code Playgroud)

我的代码有什么问题吗?或者,我的期望错了?

public class MyAppWidgetProvider extends AppWidgetProvider {    
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        Log.i("CHEOK", "onUpdate START");

        for (int appWidgetId : appWidgetIds) {
            Log.i("CHEOK", "onUpdate " + appWidgetId);

            RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout_inverse_holo_light);

            // Register an onClickListener
            Intent refreshIntent = new Intent(context, JStockAppWidgetProvider.class);
            refreshIntent.setAction(REFRESH_ACTION);
            refreshIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
            PendingIntent refreshPendingIntent = PendingIntent.getBroadcast(context, 0, refreshIntent, PendingIntent.FLAG_UPDATE_CURRENT);            
            remoteViews.setOnClickPendingIntent(R.id.refresh_button, refreshPendingIntent);

            appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
        }
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        AppWidgetManager mgr = AppWidgetManager.getInstance(context);
        if (intent.getAction().equals(REFRESH_ACTION)) {
            int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
                AppWidgetManager.INVALID_APPWIDGET_ID);

            Log.i("CHEOK", "onReceive " + appWidgetId);

            // How can I access my remoteView?
            // During onUpdate, is saving all the remoteViews in local member
            // Map<appWidgetId, remoteView> a good idea?
        }
        super.onReceive(context, intent);
    }

    private static final String REFRESH_ACTION = "org.yccheok.jstock.gui.widget.MyAppWidgetProvider.REFRESH_ACTION";  
}
Run Code Online (Sandbox Code Playgroud)

Phu*_*eat 5

这是因为您的PendingIntent都被视为相同,因此创建第二个将替换第一个,请参阅:http: //developer.android.com/reference/android/content/Intent.html#filterEquals%28android.content .Intent 29%

为了意图解析(过滤)的目的,确定两个意图是否相同.也就是说,如果他们的行为,数据,类型,类别和类别是相同的.这不会比较意图中包含的任何额外数据.

因此,你的只是Extra的不同,这是行不通的.尝试使用setData设置内容.

refreshIntent.setData(Uri.parse(refreshIntent.toUri(Intent.URI_INTENT_SCHEME)));
Run Code Online (Sandbox Code Playgroud)