Rso's Jotter

日々の開発の知見のメモやその他雑記

PendingIntentを用いたBroadcast

Appwidget等のウィジェットにBroadcastを通知するためには,通常のIntentをBroadcastするだけでは
反応してくれない様子.そこでPendingIntentのgetBroadcastを使えば反応してくれた.

private void sendPendingIntent(int value){
	Intent updateIntent = new Intent();
	updateIntent.setAction(TESTACTION);
	updateIntent.putExtra("value", value);
	PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, updateIntent, 0);
	try {
		pendingIntent.send();
	} catch (CanceledException e) {
		Log.e("debug", "PendingIntent is cancelled :" + e);
	}
}


しかしputExtraを使って異なるデータを格納して,このPendingIntentを複数回発行した場合は,最初の1回目に渡した値しか受け取ってくれない.

public class TestActivity extends Activity {
    final static String testIntent = "intent.testIntent";
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        IntentFilter filter = new IntentFilter(testIntent);
        this.registerReceiver(receiver, filter);

       //broadcastを2回やる
        this.sendPendingIntent(10);
        this.sendPendingIntent(100);
        
    }
     
    TestReceiver receiver = new TestReceiver();
    
    public class TestReceiver extends BroadcastReceiver{
		  @Override
		  public void onReceive(Context context, Intent intent) {
			  int v = intent.getIntExtra("value", -1); 
			  Log.d("debug", "broadcast receive:" + v);
		  }
	}
    
	private void sendPendingIntent(int value){
		Intent updateIntent = new Intent();
		updateIntent.setAction(testIntent);
		updateIntent.putExtra("value", value);
		Log.d("debug", "putextra:" +value);
		PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, updateIntent, 0);
		try {
			pendingIntent.send();
		} catch (CanceledException e) {
			Log.e("debug", "pendingIntent is cancelled :" + e);
		}

	}
    
}

//ログの出力結果
03-02 22:12:27.876: DEBUG/debug(1347): putextra:10
03-02 22:12:27.886: DEBUG/debug(1347): putextra:100
03-02 22:12:27.916: DEBUG/debug(1347): broadcast receive:10
03-02 22:12:27.916: DEBUG/debug(1347): broadcast receive:10 <<<<これが前の値になってる

解決策としては,PendingIntent.getBroadcastの4番目の引数にPendingIntent.FLAG_UPDATE_CURRENTを入れてやると同じIntentがBroadCastされた場合putExtraで格納したデータが更新される.