2014-04-08 50 views
7

首先,這個問題可能聽起來真的很荒謬的一些Android的老兵但作爲一個新手,我真的要問這樣一個問題:

一個Intent是承載從一個Activity到另一個信息被動的數據結構。 Intent也能夠以名稱 - 值對的形式保存數據(通過putExtra())。

雖然覆蓋onCreate()方法,我們傳遞一個Bundle作爲參數,它最終也以名稱 - 值對的形式保存值,並且能夠藉助onSaveInstanceState()存儲信息。

在這樣的情況下,我們爲什麼需要兩者兼而有之,並區分兩者?

UPDATE

我想我領你們到我誤解了Intent是什麼misbelief:

當我說「一個Intent是一種被動的數據結構,從一個Activity攜帶信息到另一個「,我打算指出的是,在putExtra()方法的幫助下,即使是Intent也可以攜帶信息(上下文和動作描述除外)。爲什麼我們需要使用Bundle呢?

此外,請確保您在下面的評論中留下原因,以防止您投下/投票表決問題。感謝慷慨。Bundle和Intent有什麼區別?

+0

閱讀本文http://stackoverflow.com/questions/4999991/what-is-a-bundle-in-an-android-application#autocomment35012928 – user

+0

上面的鏈接錯過了這個問題的觀點,這是爲了區分數據以Intent傳遞,數據以Bundle傳遞。如果你來到這裏,你已經訪問過這個鏈接。 –

回答

3

我真的不從哪裏得到這個定義Intent知道,但作爲一個「意圖」的定義

的意圖是操作的抽象描述進行。 它可以與startActivity一起使用來啓動一個活動, broadcastIntent將其發送給任何感興趣的BroadcastReceiver組件,並將startService(Intent)或bindService(Intent, ServiceConnection,int)與後臺Service進行通信。

Intent提供了一種工具,用於在不同應用程序中的代碼之間執行後期運行時綁定 。其最重要的用途是 正在開展活動,它可以被認爲是活動之間的膠水。它基本上是一個被動數據結構,其中包含一個要執行的動作的抽象描述。

所以意圖是要鏈接到新的(活動,服務,廣播接收器)

Intent你會發現額外

額外定義的行爲 - 這是一個Bundle的任何額外信息。這可以用來爲組件提供擴展信息。例如,如果我們有一個發送電子郵件的動作,我們也可以在這裏包含額外的數據以提供主題,主體等。

因此,這意味着在Intent附加是一束

一個目的要Bundle正如你所提到它是從一個意向另一個用於數據載體和是地圖上Key-Value變量。

+0

請重新閱讀並回復問題。我已經更新了描述。 – ikartik90

+0

檢查我的更新然後 –

+0

但爲什麼是'putExtra()''Intent'而不是'Bundle'的返回類型?請進一步回覆我的愚蠢問題,並提供答案。謝謝。 – ikartik90

4

我想你已經明白Bundle是什麼了:鍵值對的集合。

但是,意圖更多。它包含有關應執行的操作的信息。這個新操作由它可以使用的操作以及它應該顯示/編輯/添加的數據來定義。系統使用此信息爲請求的操作找到合適的應用程序組件(活動/廣播/服務)。

將意圖看作一個Bundle,其中還包含誰應該接收包含的數據以及應該如何呈現的信息。

+0

更新了這個問題。對不起之前的不適當的描述。回答你的答案,但這就是我想要問的問題 - 「爲什麼我們需要一個'Bundle',當我們已經具有與'Intent'相同的功能?「 – ikartik90

+2

因爲您有時需要一組沒有預定義意義的鍵值對,這些意向字段具有這樣的含義。您經常需要某種字典在與開始操作無關的地方任何方式。 –

3

意圖促進組件之間的通信.Intent是組件之間傳遞的消息,如活動。 可以使用intent.putExtra(鍵,值)intent.putExtra(束)

Intent intent = new Intent(); 

intent.setClass(this, Other_Activity.class); 
// intent.putExtra(key,value) 
intent.putExtra("EXTRA_ID", "SOME DATAS"); 
startActivity(intent); 

使用軟件包:

Bundle bundle=new Bundle(); 
bundle.put(key,value); 
intent.putExtra(bundle); 
startActivity(intent); 

呼叫束在另一個活動:

Bundle extras=getIntent().getExtras(); 
extras.getString(key); 
2

來自意圖類,兩者之間真的沒有區別。檢查下面的代碼Intent類:

public Intent putExtra(String name, String value) { 
     if (mExtras == null) { 
      mExtras = new Bundle(); 
     } 
     mExtras.putString(name, value); 
     return this; 
    } 

而且

public Intent putExtras(Bundle extras) { 
     if (mExtras == null) { 
      mExtras = new Bundle(); 
     } 
     mExtras.putAll(extras); 
     return this; 
    } 

所以我認爲,唯一的區別是易用性的.. :)爲1,您不需要創建包明確。