android:如何在活动之间进行通信,或者如何保持彼此的实例

时间:2013-11-28 03:31:08

标签: android android-activity

我有两个活动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");

3 个答案:

答案 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和使用静态变量来交换值。我不确定。

相关问题