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で格納したデータが更新される.