2013-11-03 33 views
3

當我們想要將一些數據攜帶到另一個應用程序組件時,我們使用額外的意圖。意圖只是一個關鍵的價值對。 我們首先將我們的鑰匙定義爲公共常數,並給它一個價值。例如爲什麼要初始化額外的密鑰?

public static final String extra_key = "com.example.myapp.MESSAGE"; 

我們還必須指定密鑰需要由意圖攜帶的數據。例如

String extra_value = editText.getText().toString(); 

然後我們作出這樣的意圖的一個額外的:

intent.putExtra(extra_key, extra_value); 

我的問題:

  1. 爲什麼關鍵必須是公開的嗎?

  2. 爲什麼我們首先需要首先初始化密鑰,爲什麼我們不能只聲明它,因爲它將被分配一個值(數據到 由意圖傳送)。那麼我們爲什麼不能做一些像 public static final String extra_key;

  3. 我已閱讀,鍵值應該包括反向域名,以便它在其他情況下,包急跌是獨一無二的。但是,什麼是 的給它點一個唯一的值,無論如何是 指定的另一個值,這是 意圖所攜帶的數據。

在此先感謝您。

回答

4

Why does the key have to be public?

事實並非如此。這不是關於意圖附加項或關鍵值對的問題。這只是一個關於Java變量範圍和可見性的問題。

在調用類:

intent.putExtra("KEY_NAME", "Key_Value"); 

在接收組件:

intent.getStringExtra("KEY_NAME"); 

這項工作就好了。 好的做法是使它public final static,使發送者和接收者可以使用相同的常量名稱。

Why do we need to intialize the key in the first place, why can't we just declare it, because it will be assigned a value (the data to be carried by the intent) anyway. So why couldn't we do something like

見上文。關鍵名稱不過是一個字符串。重要的是不是攜帶數據,值的確如此。

I have read that the key value should include the reverse domain name

這沒有任何意義。關鍵值是發送者想要發送給接收者的任何數據。或者你的意思是關鍵的名字?接收方必須知道密鑰的名稱,因此如果此意圖是啓動外部組件,則必須使用接收方定義的密鑰名稱。如果意圖是用於內部組件,那麼您將該名稱定義爲任何您想要的。我看不到包含軟件包名稱的好理由。它只是使用更多的內存。

+0

我從來沒有在應用程序中包含從一個活動發送數據到另一個活動的包名,這是沒有意義的。 – NickT

+0

好吧,關鍵不包含數據,但價值確實,我理解但是我的問題stion是爲什麼我們需要爲鍵分配任何值,爲什麼我們不能將它聲明爲一個字符串,但不給它一個值?因爲我沒有看到任何地方使用「com.example.myapp.MESSAGE」。 – user2882662

+0

@NickT,但文檔說'公共意圖putExtra(字符串名稱,字符串值)'將擴展數據添加到意圖。該名稱必須包含包前綴,例如com.android.contacts應用程序將使用「com.android.contacts.ShowAll」之類的名稱。儘管我自己並沒有使用它 – Raghunandan

1

該鍵用於存儲和檢索該值。你可以認爲它像一個HashMap的關鍵。

  1. ,因爲你可以想重用在多個位置相同的密鑰(例如存儲在一個活動的值和檢索anaother一個值)
  2. 當您這意味着,不屬於成員爲靜態一個對象的特定實例,但該類的所有對象都將共享它。如果刪除static關鍵字就可以初始化你的變量在構造函數中,但是,在這種情況下,它屬於對象實例,它是不是一個常數

如果您需要澄清,隨便問

0
  1. 爲什麼鑰匙必須公開?

您可能想要在不同的類中使用該鍵來獲取值,以便讓它具有靜態和公共。

在其他活動

String s = getIntent().getStringExtra(MainActivity.extra_value); 
    // considering extra_value is static in MainActivity 

你不必有這樣的說法。

intent.putExtra("mykey", extra_value); 

然後在其他活動

String s = getIntent().getStringExtra("mykey"); // keys must match 

可變extra_key取回被聲明爲字符串,並初始化,它是靜態的。

靜態修飾符與最終修飾符一起用於定義常量。最終修飾符表示該字段的值不能更改。

以這種方式定義的常量不能被重新分配,如果程序試圖這樣做,則這是一個編譯時錯誤。

檢查主題constants.

public static final String extra_key= "com.example.myapp.MESSAGE"; 

Java: define terms initialization, declaration and assignment

http://developer.android.com/reference/android/content/Intent.html

+0

但是有什麼用值「com.example.myapp.MESSAGE」的。我不認爲它在任何地方使用? – user2882662

+0

@ user2882662您需要對其進行初始化,並且在其他活動中檢索字符串時需要密鑰 – Raghunandan

+0

@ user2882662如果基本類型或字符串被定義爲常量並且該值在編譯時已知,則編譯器將替換常量在代碼中隨處可見它的值。請檢查主題常量http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html – Raghunandan