LoginSignup
21
21

More than 5 years have passed since last update.

AndroidでiOSのNSNotificationCenter的なことをやる

Posted at

目的

Androidで、アプリ内のインスタンスに対してイベントを通知したいが
クラス間でListenerを介するようなやり方は適さないような場合の通知方法。

iOSではNSNotificationCenterが利用できるが
AndroidではLocalBroadcastManagerというものがある。

※「そもそもNSNotificationCenterってどういうときに使うんだっけ?」
というのが気になる人は以下が参考になると思う。

DelegateとNotificationの使い分け

実装

受信側

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

21
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
21