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的交互問題。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *