【问题标题】:How to send message from BroadcastReceiver to activity or fragment如何将消息从 BroadcastReceiver 发送到活动或片段
【发布时间】:2014-10-28 15:45:00
【问题描述】:

我有一个接收器,它可以保存呼叫详细信息,例如存储来电、去电等。所有这些详细信息都将保存到 sqlite DB。如果我的活动没有运行,那很好。

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

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

我在这部分有点困惑

【问题讨论】:

    标签: android sqlite android-fragments


    【解决方案1】:

    您可以使用 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

    您的 Activity 必须在 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 的帮助,谢谢。你的回答效果很好。太感谢了。我想知道,如果你有任何答案stackoverflow.com/questions/26449858/…
    • 好吧,既然您似乎更喜欢劣质的答案(也许是因为它更快?)我会传递您的下一个问题。
    【解决方案2】:

    您可以在活动中创建广播接收器。在 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
    }
    

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

    【讨论】:

    • 你能告诉我任何示例代码吗?欢迎任何例子。谢谢提示。我正在使用列表片段,需要通知
    • 这里,我不需要从我的接收器执行任何操作吗?我只需在我的活动中添加您指导的代码并尝试就可以了吗?
    • @Naruto 当然你需要在接收器中执行操作。正如我所说:每当您的其他接收器收到广播时,也向该接收器发送广播。如果活动正在运行(即在前面),将收到广播。在它的 onReceive() 中做任何你想做的事情。
    • 这是发送Intent intent = new Intent(action); LocalBroadcastManager mgr = LocalBroadcastManager.getInstance(context); mgr.sendBroadcast(intent);的方式。实际上我已经在清单文件中为实际接收器添加了过滤器,但是在接收器中我需要像我粘贴在评论代码中一样再次添加它们吗?我的意思是这里的行动意味着什么?
    • @Naruto 广播接收器由其 IntentFilter 标识。要向此广播发送 Intent,请发送如下: Intent in=new Intent("intent_filter");in.putExtra(//put any extras u want);context.sendBroadcast(in);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    相关资源
    最近更新 更多