目的
Androidで、アプリ内のインスタンスに対してイベントを通知したいが
クラス間でListenerを介するようなやり方は適さないような場合の通知方法。
iOSではNSNotificationCenter
が利用できるが
AndroidではLocalBroadcastManager
というものがある。
※「そもそもNSNotificationCenterってどういうときに使うんだっけ?」
というのが気になる人は以下が参考になると思う。
実装
受信側
ReceiverActivity
@Override
public void onCreate(Bundle savedInstanceState) {
...
// レシーバーの登録
// NSNotificationCenter.defaultCenter().addObserver(...)の役割
// "MY_EVENT"という名前のIntentを受取る
LocalBroadcastManager.getInstance(this)
.registerReceiver(mMessageReceiver, new IntentFilter("MY_EVENT"));
}
// 登録するレシーバー
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Extraから値を得る
String message = intent.getStringExtra("message");
Log.d("receiver", "受信メッセージ: " + message);
}
};
@Override
protected void onDestroy() {
// レシーバーの削除
// NSNotificationCenter.defaultCenter().removeObserver(...)の役割
LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
super.onDestroy();
}
送信側
SenderActivity.java
void sendMessage(Context context) {
Log.d("sender", "メッセージ送信実行");
// "MY_EVENT"という名前でIntentを送る
Intent intent = new Intent("MY_EVENT");
// IntentなのでExtraの利用が可能
intent.putExtra("message", "ガルパンはいいぞ");
// 送信
// NSNotificationCenter.defaultCenter().postNotificationName(...)の役割
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
}
備考
同じレシーバーを複数のイベントに対して登録した場合も問題なく動作した。
ソースを見てみたところ、レシーバーの削除も一回で全て削除される。
参考
iphone - Android equivalent to NSNotificationCenter - Stack Overflow
http://stackoverflow.com/questions/3947641/android-equivalent-to-nsnotificationcenter/8875275#8875275
DelegateとNotificationの使い分け | Cyber Passion for iOS
http://blogios.stack3.net/archives/31