在将 iPhone 应用程序移植到 android 的过程中,我正在寻找在应用程序内进行通信的最佳方式。意图似乎是要走的路,这是最好的(唯一的)选择吗? NSUserDefaults 在性能和编码方面似乎比 Intents 轻得多。
我还应该添加我有一个状态的应用程序子类,但我需要让另一个活动知道一个事件。
原文由 John 发布,翻译遵循 CC BY-SA 4.0 许可协议
在将 iPhone 应用程序移植到 android 的过程中,我正在寻找在应用程序内进行通信的最佳方式。意图似乎是要走的路,这是最好的(唯一的)选择吗? NSUserDefaults 在性能和编码方面似乎比 Intents 轻得多。
我还应该添加我有一个状态的应用程序子类,但我需要让另一个活动知道一个事件。
原文由 John 发布,翻译遵循 CC BY-SA 4.0 许可协议
我找到的最好的等效项是 LocalBroadcastManager ,它是 Android Support Package 的一部分。
来自 LocalBroadcastManager 文档:
在您的流程中注册并向本地对象发送 Intent 广播的帮助程序。与使用 sendBroadcast(Intent) 发送全局广播相比,这具有许多优势:
- 您知道您正在广播的数据不会离开您的应用程序,因此无需担心泄露私人数据。
- 其他应用程序不可能将这些广播发送到您的应用程序,因此您不必担心它们可能会利用安全漏洞。
- 它比通过系统发送全球广播更有效。
使用它时,您可以说 Intent
等同于 NSNotification
。这是一个例子:
监视名为 "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();
}
发送/广播通知的第二个活动。
@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 并由 mMessageReceiver
在 ReceiverActivity
接收
调试输出应如下所示:
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 许可协议
3 回答958 阅读✓ 已解决
2 回答1k 阅读✓ 已解决
1 回答837 阅读✓ 已解决
2 回答946 阅读
2 回答886 阅读
1 回答820 阅读
2 回答719 阅读
你可以试试这个:http: //developer.android.com/reference/java/util/Observer.html