我有两个活动A和B,B是对话模式,A开始B,它们都可见。在两个活动运行期间,如何相互沟通? 一种方法是在每个活动中注册BroadcastReceiver。但是BroadcastReceiver无法获得每个sendBroadcast(i)的结果:它是安全的:
// at ActivityA onCreate
mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
...//receive msg
}
};
Log.i(TAG,"register broadcast");
IntentFilter intentFilter = new IntentFilter(
"xxx1"); //"xxx2" in ActivityB
this.registerReceiver(mReceiver, intentFilter);
有些事情发生在ActivityB:
Intent i = new Intent("xxx1"); // "xxx2" at activityA
...//some paramters
sendBroadcast(i);
Log.i(TAG,"send status");
答案 0 :(得分:1)
您不想保留Activity的实例,因为它可能会导致非常糟糕的内存泄漏。 可以在任何配置更改(例如设备轮换或键盘更改)上重新创建活动,在这种情况下,将创建一个新的Activity实例,并且您的引用将用于旧的活动实例。
您可以采取一些措施来与活动交换数据。 (按照从最好/最简单到更难的顺序)
1)如果这是一种简单的单向数据交换,您可以在启动Bundle
时发送Activity
数据。见(http://developer.android.com/reference/android/content/Intent.html)
2)您可以使用startActivityForResult
来打开Activity
,以便返回一些数据结果。见(http://developer.android.com/reference/android/app/Activity.html)
3)有点复杂,但你可以使用像Otto(http://square.github.io/otto/)
这样的pub / sub行为的EventBus机制答案 1 :(得分:1)
这两项活动并非同时运行。
当A开始B时,序列如下(我已经省略了其他生命周期事件,这取决于你活动的各个代码):
onPause()
A [前景生命周期结束A]
B 的onResume()
[B的前景生命周期开始]
...... B结束......
B 的onPause()
[B的前景生命周期结束]
A 的onResume()
[前景生命周期为A开始]
(因为B是部分覆盖A的对话框)。 B完成后,调用A的onResume()
。
当A开始B时,A的foreground lifetime
结束,但A的visible lifetime
继续,因为A仍然部分可见(在B的背景中)。
因此,对于您的问题 During both activities running, how to communicate each other?
答:在任何时候,只有一个活动正在运行(即具有前景生命周期并且可以与用户交互)。 两个活动都没有同时运行。
Documentation明确提到:
活动的可见生命周期发生在对onStart()的调用之间,直到对onStop()的相应调用。在此期间,用户可以在屏幕上看到活动, 虽然它可能不在前台并与用户交互。
活动的前景生存期发生在对onResume()的调用之间,直到对onPause()的相应调用。
During this time the activity is in front of all other activities and interacting with the user.
答案 2 :(得分:0)
你能否尝试使用FragmentActivity。活动A是您的主要FragmentActivity,活动B是片段显示活动B和使用静态变量来交换值。我不确定。