今天遇到一個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的交互問題。