Почему setOnClickPendingIntent в двух виджетах отдает одинаковый widgetId?

Есть два виджета
SkWidgetProvider
public class SkWidgetProvider extends AppWidgetProvider {

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

        Log.i("SK", "Update");

        for (int wid: appWidgetIds) {
            Log.i("SK", "Update - " + wid);
        }

        // Build the intent to call the service
        Intent intent = new Intent(context.getApplicationContext(),
                SkWidgetService.class);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);

        // Update the widgets via the service
        context.startService(intent);
    }
}


При первом запуске провайдер отдает 9 и 10 и метод вызывается с widgetId = 9 и widgetId = 10.
Update
I/SK: Update - 9
I/SK: Update - 10
I/SK: Service
I/SK: Service - 9
I/SK: Service - 10
I/SK: Run - 9
I/SK: Set new - 9
I/SK: Run - 10
I/SK: Set new - 10


Но после установки setOnClickPendingIntent при клике на любом из двух виджетов выдается только 10

I/SK: Update
I/SK: Update - 10
I/SK: Service
I/SK: Service - 10
I/SK: Run - 10
I/SK: Set new - 10


SkWidgetService
public class SkWidgetService extends Service {

    private Context mContext;
    private AppWidgetManager mAppWidgetManager;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        Log.i("SK", "Service");

        mContext = getApplicationContext();

        mAppWidgetManager = AppWidgetManager.getInstance(mContext);

        int[] appWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);

        for (int widgetId : appWidgetIds) {

            Log.i("SK", "Service - " + widgetId);

            update(widgetId);
        }

        return super.onStartCommand(intent, flags, startId);
    }

    private void update(final int widgetId) {

            RemoteViews remoteViews = new RemoteViews(mContext.getPackageName(),
                    R.layout.widget_layout);

            remoteViews.setTextViewText("test");

            mAppWidgetManager.updateAppWidget(widgetId, remoteViews);

            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {

                    Log.i("SK", "Run - " + widgetId);

                    updateWidgetView(widgetId);
                }
            }, 1000);
    }

    private void updateWidgetView(int widgetId) {

        RemoteViews remoteViews = new RemoteViews(mContext.getPackageName(),
                R.layout.widget_layout);

        remoteViews.setTextViewText("test run");

        // Register an onClickListener
        Intent clickIntent = new Intent(mContext, SkWidgetProvider.class);

        int[] widgetIds = {widgetId};

        for (int ids : widgetIds) {
            Log.i("SK", "Set new - " + ids);
        }

        clickIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
        clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, widgetIds);

        PendingIntent pendingIntent = PendingIntent.getBroadcast(
                mContext, 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT
        );

        remoteViews.setOnClickPendingIntent(R.id.update, pendingIntent);
        mAppWidgetManager.updateAppWidget(widgetId, remoteViews);

        stopSelf();
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}


Что я не так понял?
  • Вопрос задан
  • 92 просмотра
Решения вопроса 1
KuSu
@KuSu
Android разработчик
Попробуй поменять int requestCode при генерирование pendingIntent. Например, с помощью Random. У каждого он должен быть уникальный, а не 0.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы