2012-06-09 36 views
1

我正在將一些在清單中定義的BroadcastReceiver s遷移到LocalBroadcastManager將全局BroadcastReceivers遷移到LocalBroadcastManager

這些BroadcastReceiver s不需要從其他應用程序調用。 通過sendBroadcast()Activitys響應UI操作或從執行HTTP請求並在Intent中傳遞響應的實用程序類中調用它們。

我最近才發現約LocalBroadcastManager,並且想優化我的代碼。我還沒有做出任何基準(我不知道如何)。它值得做還是過早優化?爲響應用戶操作而調用BroadcastReceiver,因此遷移可能不值得。

registerReceiver應該在哪裏註冊? Application是正確的地方嗎?

+0

你能爲此提供一個用例嗎?在清單中註冊'BroadcastReceiver'的主要原因 - 所以第三方代碼可以通過特定的廣播操作或'PendingIntent'來調用它們 - 對於LocalBroadcastManager沒有意義。如果你可以解釋爲什麼你首先有本地唯一的「全球'BroadcastReceivers'」,它可能會幫助我們爲你提供更好的建議。 – CommonsWare

+0

感謝您的詢問。我已經更新了這個問題 - 在編寫舊代碼時我根本不知道「LocalBroadcastManager」。 – mparaz

+0

您添加的兩個句子雖然很好,但沒有提供用例,也沒有解釋爲什麼您只有本地「全局」BroadcastReceivers「」,正如我在我的初始評論中所建議的那樣。 – CommonsWare

回答

1

registerReceiver註冊應該在哪裏完成?

他們應該由任何組件負責他們的工作進行註冊。

原則上,LocalBroadcastManager用於組件間通信。最典型的例子是IntentService發送本地廣播Intent讓任何感興趣的活動知道某些事情發生了變化......當且僅當前臺有這樣的活動。在這種情況下,這些活動將在onResume()中註冊一個接收者,並在onPause()中註銷該接收者。

那麼,讓我們看看你的兩個輕輕描述的 「用例」:

從Activitys

響應UI操作

刪除sendBroadcast()。刪除BroadcastReceiver。只需在這裏完成這項工作,或者撥一個AsyncTask來完成這項工作,或者通過startService()發送命令給IntentService做這件事。

來自執行HTTP請求並在Intent中傳遞響應的實用程序類。

這個「工具類」正在被一個活動(通過AsyncTask),一個IntentService或兩者都不被使用。

如果實用程序類是從一個活動中使用由AsyncTask,轉儲sendBroadcast(),轉儲BroadcastReceiver,並簡單地做這項工作在AsyncTask和/或活動。

如果實用程序類正被IntentService使用,並且您嘗試根據該工作更新UI,那麼我在我的答案的第二段中概述了這種模式。

+0

一個很好的例子就是當你使用tabhost並想要interchild事件管理時 – L7ColWinters

+3

@ L7ColWinters:將標籤中的活動放入標籤是一個糟糕的解決方案,幸運的是,現在已經正式被棄用了。 – CommonsWare