2011-02-22 41 views
5

我一直在使用putExtra()創建intents很長一段時間,並且只是在Android文檔中閱讀,我應該在包名稱的前面加上'name'。因此,它應該更像'putExtra(「com.mycompany.myapplication.ButtonText」,「Ok」),而不是'putExtra(「ButtonText」,「Ok」)。使用putExtra創建intent

這真的有必要嗎? (沒有它似乎沒問題)。

如果有必要有什麼優勢?

另外,包名是調用者還是被調用的名稱?如果是呼叫者,那麼'所謂的'活動'必須知道呼叫者的名字,這不是非常通用的。

感謝

回答

7

這真的有必要嗎? (沒有它似乎沒問題)。

不,這不是必要一個完全獨立的應用程序,但可能會被認爲是很好的做法反正。

在公共可用的應用程序中,更重要的是它們可以進行交互,但保持某種方式來唯一標識自己以及它們正在交換的數據。至於使用哪個包名取決於上下文。

舉個抽象的例子...

A公司生產的一個應用程序,可以提供某種數據處理的哪些應用由公司B和公司C製作可以使用。意圖的「行動」將被命名爲與公司A相關,但兩個「客戶」應用程序傳遞給它的數據將被命名爲與客戶應用程序公司相關。例如...

APPA的文檔......

To request data processing use: 
com.companyA.intent.action.PROCESS_DATA 

Pass data with the above intent as an extra named: 
<your package name>.SOME_DATA 

現在,當APPA的相關組件被稱爲與上述情況,它會檢查是否有是一個「額外」與同.SOME_DATA結尾的名稱但由於唯一的前綴,它還能夠將數據與其他應用程序提供的其他數據分開保存。所以......

B公司代碼

Intent i = new Intent(com.companyA.intent.action.PROCESS_DATA); 
i.putExtra(com.companyB.SomeApp.SOME_DATA, data); 

C公司代碼

Intent i = new Intent(com.companyA.intent.action.PROCESS_DATA); 
i.putExtra(com.companyC.SomeOtherApp.SOME_DATA, data); 

OK,我更好的例子可能不是一個,但它歸結爲是很重要的,看看如何Android環境非常關注不同的應用程序組件能夠相互使用,傳遞數據以及該數據的來源是唯一可識別的。

+0

謝謝你,將其清除了很多。有一點我沒有在你的例子中得到。 - 是否假設「com.companyB.SomeApp.SOME_DATA」是任何特定類型(例如String)?我會認爲這是一個字符串,公司A的代碼必須在修改之前的所有內容,包括最後一個「點」?如果是這樣,這必須由公司A,B和C(顯然)「理解」。 – steve 2011-02-23 00:39:57

+0

@steve:putExtra使用表單(字符串名稱,值爲),其中'name'必須在兩側都可以理解 - 'value'可以是不同的類型(int,string等)。我的例子是基於應用程序如何直接而不是在廣播中進行通信(例如「我在這裏有一個圖像文件,誰知道如何打開它?」一種Intent)。在你自己的應用程序組件之間傳遞數據仍然意味着他們需要知道'額外'意味着什麼,但是開發人員總是有潛力創建其他開發人員可以基於已發佈文檔使用的應用程序 – Squonk 2011-02-23 06:47:35

+0

感謝@MisterSquonk,我明白。我認爲這種事情的一個很好的模式就是總是通過一個完全合格的'名字'在'額外'中傳遞一個包。然後,捆綁包中的各個值可能會有短名稱,因爲可以明確調用者是基於捆綁包名稱的。這將更容易解析並在代碼中讀取。當然,你可以限定每一塊數據,但這似乎有點像矯枉過正......再次感謝(也感謝其他評論者) – steve 2011-02-23 16:26:52

3

這聽起來更像是一個比一個實際需求的「最佳實踐」的事情。您在這裏獲得的好處是,如果您在通過跨多個應用程序的多個活動處理的泛型意圖中填充了大量內容,那麼您對Intent中的數據更具體。如果您只在應用程序的內部使用這些意圖,並且只有您自己的活動正在處理它們,那麼您就很好。

1

我認爲這是一個偉大的想法如果你正在將你的擴展數據包裝成一個可序列化的類,說com.mycompany.myapp。MyAppData和發送它作爲:

intent.putExtra("com.mycompany.myapp.MyAppData",myAppData); //==> out 

和檢索它:

MyAppData myAppData= (com.mycompany.myapp.MyAppData)intent.getSerializableExtra("com.mycompany.myapp.MyAppData",myAppData; // <== in 

JAL