最近看了有关AppWidget的文档,对以前做的音乐播放器进行了修改,增加了Widget功能。效果如下:

 

PendingIntent中requestCode的应用_Widget

    写了Widget类,继承了AppWidgetProvider,重写了onUpdate方法,如下:

  1. @Override 
  2.     public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
  3.             int[] appWidgetIds) { 
  4.         // 
  5.         RemoteViews views=new RemoteViews(context.getPackageName(), R.layout.widget_layout); 
  6.          
  7.         Intent upIntent=new Intent(context, MyPlayService.class); 
  8.         upIntent.putExtra("command", Command.UP); 
  9.          
  10.         Intent startIntent=new Intent(context, MyPlayService.class); 
  11.         startIntent.putExtra("command", Command.START); 
  12.  
  13.         Intent pauseIntent=new Intent(context, MyPlayService.class); 
  14.         pauseIntent.putExtra("command", Command.PAUSE); 
  15.  
  16.         Intent stopIntent=new Intent(context, MyPlayService.class); 
  17.         stopIntent.putExtra("command", Command.STOP); 
  18.  
  19.         Intent nextIntent=new Intent(context, MyPlayService.class); 
  20.         nextIntent.putExtra("command", Command.NEXT); 
  21.          
  22.         Log.i(TAG, "---Intent's content---"); 
  23.         Log.i(TAG, "upIntent--->"+upIntent); 
  24.         Log.i(TAG, "startIntent--->"+startIntent); 
  25.         Log.i(TAG, "pauseIntent--->"+pauseIntent); 
  26.         Log.i(TAG, "stopIntent--->"+stopIntent); 
  27.         Log.i(TAG, "nextIntent--->"+nextIntent); 
  28.  
  29.         PendingIntent upPending=PendingIntent.getService(context, 0, upIntent, 0); 
  30.         PendingIntent startPending=PendingIntent.getService(context, 0, startIntent, 0); 
  31.         PendingIntent pausePending=PendingIntent.getService(context, 0, pauseIntent, 0); 
  32.         PendingIntent stopPending=PendingIntent.getService(context, 0, stopIntent, 0); 
  33.         PendingIntent nextPending=PendingIntent.getService(context, 0, nextIntent, 0); 
  34.          
  35.         views.setOnClickPendingIntent(R.id.btn_up, upPending); 
  36.         views.setOnClickPendingIntent(R.id.btn_start, startPending); 
  37.         views.setOnClickPendingIntent(R.id.btn_pause, pausePending); 
  38.         views.setOnClickPendingIntent(R.id.btn_stop, stopPending); 
  39.         views.setOnClickPendingIntent(R.id.btn_next, nextPending); 
  40.          
  41.         for(int i=0; i<appWidgetIds.length; i++){ 
  42.             appWidgetManager.updateAppWidget(appWidgetIds[i], views); 
  43.         } 
  44.          
  45.         super.onUpdate(context, appWidgetManager, appWidgetIds); 
  46.     } 

 

然后我在MyPlayService类中的onCommand方法里打印收到的command,发现无论按哪一个按钮,LogCat输出地command都是同一个值。

这和我的预期是不一样的。通过多次查找,发现问题发生在生成PendingIntent对象时,把requestCode都设为同一个值了,这就导致了上述现象。

把requestCode设为不同的值即可消除上述现象。

  1. PendingIntent upPending=PendingIntent.getService(context, 0, upIntent, 0); 
  2.     PendingIntent startPending=PendingIntent.getService(context, 1, startIntent, 0); 
  3.     PendingIntent pausePending=PendingIntent.getService(context, 2, pauseIntent, 0); 
  4.     PendingIntent stopPending=PendingIntent.getService(context, 3, stopIntent, 0); 
  5.     PendingIntent nextPending=PendingIntent.getService(context, 4, nextIntent, 0);