你們都知道startActivity()是用來切換跳轉Activity的、若是想要在另個Activity中出書數據的話、只須要在源activity中使用intent.putExtra()方法傳出數據、在對應activity中使用intent.get**Extra()方法接收數據就好了java
那麼startActivityForResult()方法呢、它也是用來帶數據跳轉activity的、但是這兩個方法具體有什麼區別呢?eclipse
這就要說說帶數據跳轉的方向了、this
第一個方法只能把數據發送過去、但是若是子activity須要再傳送回一些數據呢?spa
你可能會說、在子activity中使用intent.putExtra()方法把數據寫入、在父activity中寫入get*方法就好了嘛、code
但是、你想過沒有這個父activity中的get方法要寫在哪兒呢?blog
我想、你固然會說要想在activity一啓動就獲取數據、因此固然要寫在onCreate方法中、ip
那麼問題就來了、若是你在父activity中的onCreate方法中寫入了get*方法來讀取(得到)數據、get
那麼就意味着你一啓動父activity就會執行get*方法(由於第一個執行的方法就是onCreate)、而父activity是主方法、它一定是程序第一個執行的activity、it
也就是說、此時尚未執行子activity、也就沒有數據經過intent傳過來、因此在執行onCreate時、執行到get*方法時就會讀不到任何數據、class
並且還會在每次啓動activity時、無論需不須要從子activity接受數據都畫蛇添足的執行一遍get*方法、來獲取數據、
這樣雖然能夠實現從子activity中獲得返回的數據、但倒是不理想的、不正確的、絲毫沒有邏輯性的
那麼到底該怎麼讓父activity獲取到從子activity傳回的數據呢?
這就是第二個方法:startActivityFoResult()方法的做用了
下面具體說說這個方法是怎麼實現把子activity傳回的數據讀取過來的
先看看這個方法的參數:startActibityForResult(Intent intent,int requestCode)
發現第一個參數是Intent類型、這個就沒必要多說了、看看第二個int型的、看字義是「請求碼」、其實做用也就是請求碼、這個具體在下面說、
只要你使用了startActivityFoResult()、那麼就要在這個類中添加一個onActivityResult(int requestCode ,int resultCode ,Intent intent)這個方法、
你能夠稱它爲:回調方法(子activity回調父activity的方法)、
固然你也能夠不添加(或方法體爲空)、那也就表明你不須要對子activity傳回的數據進行操做、
反之若是你要想對子activity傳回的數據進行操做、那麼把方法體寫在這個方法中便可、
這個方法如同onCreate()同樣是這個類的成員方法、也就是說這個方法不在onCreate方法中(這樣就避免了一啓動這個activity就執行get*方法)、
這個方法有什麼用呢、你能夠理解爲它是用來監視子activity的方法、只要子activity一結束(調用了finish()方法)、它就會被執行、這樣就實現了「回調」這一功能
下面看看這個方法的參數:
int requestCode:與startActibityForResult(Intent intent,int requestCode)方法中的int requestCode參數對應、能夠理解爲請求碼
int resultCode:見名知意、結果碼、這個是在子activity中設置的
Intent intent:這個就沒必要多說了
接着咱們來看看這幾個參數的具體做用、
1)int requestCode、請求碼、它與父activity中的startActibityForResult(Intent intent,int requestCode)方法中的int requestCode參數對應、
用它來判斷是從父activity中哪一個組件請求進入子activity的、由於父activity中可能有多個按鈕或其餘組件均可以發出進入新的子activity的請求、
而onActivityResult()方法在父activity中只有一個、因此就能夠(須要)來標記清楚
2)int resultCode、結果碼、它也是起到標記的做用、它與子activity中使用setResult(int resultCode,Intent intent)方法來設置的resultCode參數對應、
那麼它的做用也就和子activity有關、用它能夠來判斷是哪一個子activity在結束後來回調這個回調方法的、由於父activity可能須要跳轉到多個不一樣的子activity
而onActivityResult()方法在父activity中只有一個、因此就能夠(須要)來標記清楚
3)Intent intent、請求執行回調方法的intent
大致都說完了、下面給出一個java代碼來直觀的看一下
//父activity核心代碼: Button button1=(Button)findViewById(R.id.button1); Button button2=(Button)findViewById(R.id.button2); //onCreate核心代碼: onCreate(){ //爲按鈕1設置監聽,放入名爲data1的數據100,設置請求嗎爲1 button1.setOnClickListener(new View.OnClickListener(){ onClick(){ Intent intent1=new Intent(); intent.setClass(this, one.class); intent.putExtra("data1", "100"); startActivityForResult(intent , 1); } } //爲按鈕2設置監聽,放入名爲data2的數據200,設置請求嗎爲2 button2.setOnClickListener(new View.OnClickListener(){ onClick(){ Intent intent2=new Intent(); intent.setClass(this, two.class); intent.putExtra("data2", "200"); startActivityForResult(intent , 2); } } } //回調方法 onActivityResult(int requestCode, int resultCode, Intent intent){ super.onActivityResult(requestCode, resultCode, intent); switch(requestCode){//判斷父activity中的哪一個按鈕 case 1://若是是按鈕1 } case 2://若是是按鈕2 } } switch(resultCode){//判斷是哪一個子activity case 1://若是是子activity1 } case 2://若是是子activity2 } } //******************************************************************
//子activity1:one.java核心代碼 Button button1=(Button)findViewById(R.id.button1); onCreate(){ //爲按鈕1設置監聽,設置結果嗎爲1 button1.setOnClickListener(new View.OnClickListener(){ onClick(){
setResult(1,intent); finish(); } }
//********************************************************************* //子activity2:two.java核心代碼 Button button1=(Button)findViewById(R.id.button1); onCreate(){ //爲按鈕1設置監聽,設置結果嗎爲2 button1.setOnClickListener(new View.OnClickListener(){ onClick(){ setResult(2,intent); finish(); } }
好累啊。。
代碼是直接寫的、某些可有可無的問題請忽略。。
之後仍是在eclipse中寫好代碼粘過來吧。。
今天這些就說完了、