我有一个接收器,它确实调用详细信息保存任务,如存储来电,拨出电话等。所有这些细节都转到sqlite DB。如果我的活动没有运行,那就好了。
有时候,当我的活动正在运行时,我会收到一些来电。接收器运行&将数据存储到DB。 UI不会刷新,因为它永远不会知道DB的变化。
这里我需要手动告诉接收者,如果活动正在运行刷新屏幕。如何在android中实现这个过程。
我在这部分中有点困惑
答案 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对象访问它们。