首页 > 代码库 > android中LocalBroadcastManager使用
android中LocalBroadcastManager使用
今天遇到一个acitivity之间通信的问题,由于我们是用TabActivity包裹了Activity(我们称之为A),所以这两个Activity是同时存在的。当在TabActivity中启动其他Activity处理一些业务,当业务处理完成时,通过onActivityResult()返回处理结果,我们需要根据返回的结果对A进行更新,但是现在问题就来了,我们怎么来更新A呢?
我发现TabActivity的onActivityResult()是在A的onResume之前执行的,也就是说,我可以在TabActivity里做一些处理,在A执行onResume的时候来更新状态,我首先想到的是通过SharedPreference,通过写一个标识,让A来读取这个标识。但是这种方式显然不能让我们满意,通过写文件来传递状态并不是很好的做法。
或者,我们可以通过广播的形式来传递状态,但是广播的操作太重,作为一个app,不应该做这种系统级的操作,而且系统级的广播还会带来安全问题。一旦被其他应用捕获就有可能被利用。
最后,从同事那里了解到有这么个东西,可以帮我们解决这个问题:LocalBroadcastManager。
它来自android 的support包,类名是android.support.v4.content.LocalBroadcastManager,是用来在同一个应用内的不同组件间发送Broadcast的,刚好与我们的场景相符合。同时,它发送的广播只在app内传播,不会泄漏到其他的应用,安全性也有了保证。而且它的使用方式很简单,与普通的广播类似。
使用方式如下,在接收方也就是我们的A,这样调用。
? ? BroadcastReceiver cameraPicBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Contextcontext, Intent intent) {
boolean isSuccess=intent.getExtras().getBoolean(MConstants.KEY_LOGIN_SUCESS);
? ? ? ? ? ?.......//更新状态
}
};
IntentFilter intentFilter = new IntentFilter( MConstants.KEY_INTENT_LOGIN_RESULT);
final LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(ctx);
localBroadcastManager.registerReceiver(cameraPicBroadcastReceiver, intentFilter);
广播的发送方的写法如下:
? ? ? ? ? Intent loginSucessIntent = new Intent();
loginSucessIntent.setAction(MConstants.KEY_INTENT_LOGIN_RESULT);
loginSucessIntent.putExtra(MConstants.KEY_LOGIN_SUCESS, false);
LocalBroadcastManager.getInstance(context).sendBroadcast(loginSucessIntent);
LocalBroadcastManager是单例的,使用方式很简单,它还可以解决Service和Activity的交互问题。
android中LocalBroadcastManager使用