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

问题描述:

我有一个接收器,它确实调用细节保存任务,如存储来电,去电等。所有这些细节去sqlite数据库。如果我的活动没有运行,那么它很好。如何发送消息从BroadcastReceiver到活动或片段

有时,当我的活动正在运行时,我收到了一些来电。接收器运行&将数据存储到数据库。 UI不会刷新,因为它从不知道数据库中的更改。

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

我在这个部分有点困惑

你可以在一个activity中创建一个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和从片段对象访问它们活动的内部。

+0

可否请你告诉我任何示例代码。任何示例都是可喜的。感谢提示。我正在使用列表片段,它需要通知 – Naruto 2014-10-28 15:52:30

+0

@Naruto请参阅编辑。 – berserk 2014-10-28 15:59:49

+0

在这里,我不需要从我的接收器执行任何操作吗?我只需要在您的活动中添加由您引导的代码并尝试一切就好吗? – Naruto 2014-10-28 18:05:56

您可以使用LocalBroadcastManager到本地广播发送到您的活动(更有效,也比使用一个全球性的广播更安全):

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

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

你的活动将必须注册一个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)。您可以使用它们在应用中的不同组件之间广播消息/事件。好处是你不需要访问Context(就像你在使用Broadcast时一样),速度更快,并且它迫使开发人员进行面向对象的编程(因为事件总是对象)。一旦你开始使用一个事件总线,你将永远不会回顾本地广播,你会取代在你的应用程序中使用的许多有时杂乱的观察者/监听器模式。

+0

嗨,帮忙+1,谢谢。你的回答运作良好。非常感谢。我想知道,如果你有任何答案http://stackoverflow.com/questions/26449858/how-long-android-take-to-update-call-details-to-call-log – Naruto 2014-10-28 18:57:09

+0

好吧,因为你似乎更喜欢劣质的答案(也许是因为速度更快?)我会传达你的下一个问题。 – 2014-10-28 19:05:19

+0

好的,很酷,生病的问题问题,让你知道。谢谢 – Naruto 2014-10-29 04:52:11