簡體   English   中英

即使按下了不同的實例小部件,onReceive也將始終接收最后一個appWidgetId

[英]onReceive will always receive the last appWidgetId, even different instance widget is being pressed

我有以下代碼。 我試圖在主屏幕上放置2個小部件實例。

這是放置2個小部件實例后正在打印的日志。

onUpdate START
onUpdate 170
onUpdate START
onUpdate 171

當我單擊第一個窗口小部件,然后單擊第二個窗口小部件時,我預計將分別打印170和171。 但是,這就是我得到的。

onReceive 171  <-- I'm expecting 170 to be printed.
onReceive 171

我的代碼有什么問題嗎? 還是我有錯誤的期望?

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";  
}

這是因為兩個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)));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM