Android相当于NSNotificationCenter

新手上路,请多包涵

在将 iPhone 应用程序移植到 android 的过程中,我正在寻找在应用程序内进行通信的最佳方式。意图似乎是要走的路,这是最好的(唯一的)选择吗? NSUserDefaults 在性能和编码方面似乎比 Intents 轻得多。

我还应该添加我有一个状态的应用程序子类,但我需要让另一个活动知道一个事件。

原文由 John 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 413
2 个回答

我找到的最好的等效项是 LocalBroadcastManager ,它是 Android Support Package 的一部分。

来自 LocalBroadcastManager 文档:

在您的流程中注册并向本地对象发送 Intent 广播的帮助程序。与使用 sendBroadcast(Intent) 发送全局广播相比,这具有许多优势:

  • 您知道您正在广播的数据不会离开您的应用程序,因此无需担心泄露私人数据。
  • 其他应用程序不可能将这些广播发送到您的应用程序,因此您不必担心它们可能会利用安全漏洞。
  • 它比通过系统发送全球广播更有效。

使用它时,您可以说 Intent 等同于 NSNotification 。这是一个例子:

ReceiverActivity.java

监视名为 "custom-event-name" 的事件通知的活动。

 @Override
public void onCreate(Bundle savedInstanceState) {

  ...

  // Register to receive messages.
  // This is just like [[NSNotificationCenter defaultCenter] addObserver:...]
  // We are registering an observer (mMessageReceiver) to receive Intents
  // with actions named "custom-event-name".
  LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
      new IntentFilter("custom-event-name"));
}

// Our handler for received Intents. This will be called whenever an Intent
// with an action named "custom-event-name" is broadcasted.
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    // Get extra data included in the Intent
    String message = intent.getStringExtra("message");
    Log.d("receiver", "Got message: " + message);
  }
};

@Override
protected void onDestroy() {
  // Unregister since the activity is about to be closed.
  // This is somewhat like [[NSNotificationCenter defaultCenter] removeObserver:name:object:]
  LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
  super.onDestroy();
}

SenderActivity.java

发送/广播通知的第二个活动。

 @Override
public void onCreate(Bundle savedInstanceState) {

  ...

  // Every time a button is clicked, we want to broadcast a notification.
  findViewById(R.id.button_send).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      sendMessage();
    }
  });
}

// Send an Intent with an action named "custom-event-name". The Intent sent should
// be received by the ReceiverActivity.
private void sendMessage() {
  Log.d("sender", "Broadcasting message");
  Intent intent = new Intent("custom-event-name");
  // You can also include some extra data.
  intent.putExtra("message", "This is my message!");
  LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}

使用上面的代码,每次单击按钮 R.id.button_send 时,都会广播一个 Intent 并由 mMessageReceiverReceiverActivity 接收

调试输出应如下所示:

 01-16 10:35:42.413: D/sender(356): Broadcasting message
01-16 10:35:42.421: D/receiver(356): Got message: This is my message!

原文由 Shiki 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题