如何从BroadcastReceiver向活动或片段发送消息

时间:2014-10-28 15:45:01

标签: android sqlite android-fragments

我有一个接收器,它确实调用详细信息保存任务,如存储来电,拨出电话等。所有这些细节都转到sqlite DB。如果我的活动没有运行,那就好了。

有时候,当我的活动正在运行时,我会收到一些来电。接收器运行&将数据存储到DB。 UI不会刷新,因为它永远不会知道DB的变化。

这里我需要手动告诉接收者,如果活动正在运行刷新屏幕。如何在android中实现这个过程。

我在这部分中有点困惑

2 个答案:

答案 0 :(得分:4)

您可以使用LocalBroadcastManager向您的Activity发送本地广播(比使用全局广播更高效,更安全):

Intent intent = new Intent(action);
LocalBroadcastManager mgr = LocalBroadcastManager.getInstance(context);
mgr.sendBroadcast(intent);

http://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html

您的活动必须在onStart中注册BroadcastReceiver并在onStop中取消注册:

private BroadcastReceiver mBroadcastReceiver;

mBroadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // do your thing
    }       
};

LocalBroadcastManager mgr = LocalBroadcastManager.getInstance(this);
mgr.registerReceiver(mBroadcastReceiver, new IntentFilter(action));
onStop中的

mgr.unregisterReceiver(mBroadcastReceiver)

现在这是Android的官方方式。我当然更喜欢使用像Otto或EventBus(https://github.com/greenrobot/EventBus)这样的事件/消息总线。您可以使用它们在应用中的不同组件之间广播消息/事件。优点是您不需要访问上下文(就像使用广播时一样),它更快,并且它迫使开发人员进行面向对象编程(因为事件总是对象)。一旦你开始使用事件总线,你将永远不会回顾本地广播,你将取代你的应用程序中使用的许多有时凌乱的观察者/听众模式。

答案 1 :(得分:1)

您可以在活动中创建BroadcastReceiver。在onResume()中注册它,并在onPause()中注销它。每当您的其他接收器收到广播时,也会向该接收器发送广播。如果活动正在运行(即在前面),则将接收广播。在onReceive()中做任何你想做的事。

示例:

BroadcastReceiver br = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            //Do stuff
        }
    };

还覆盖方法:

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(br);
}

@Override
protected void onResume() {
    super.onResume();
    registerReceiver(br, new IntentFilter("intent_filter"));//Use any string for IntentFilter you like
}

您可以通过在片段内创建方法来更新来自activiy的片段,并从活动内的Fragment对象访问它们。