標籤:
Intent在Activity中的作用主要是有兩個:
1、啟動目標Activity
2、傳遞資料
Intent在傳遞資料時分兩種情況:向下一個Activity傳遞資料和從下一個Activity返回資料。
一、向下一個Activity傳遞資料主要是利用Intent作為“信使”來調用,
原Activity需要建立一個intent,並用putExtra(鍵,值)方法向intent中放入需要傳遞的資訊,然後啟動。
public void onClick(View view){ String msg = "hello,SecondActivity"; Intent intent = new Intent(FirstActivity.this,SecondActivity.class); intent.putExtra("amsg",meg); startActivity(intent); }
那麼在目標Activity中則需要對發來的intent進行解析,得到其中的資訊,並將其擷取。
Intent intent = getIntent();//擷取傳來的intent對象String data = intent.getStringExtra("amsg");//擷取索引值對的鍵名Log.d("SecondActivity",data);//在logcat中可以得到顯示結果
過程:擷取傳來的intent——擷取其中的資訊——顯示
二、返回資料給上一個活動
從目標Activity傳遞到原Activity,存在的問題是可能存在目標與原始一對多的情況,那麼就需要“約定的暗號”來進行傳遞,否則Activity不知道將資料回傳給誰。
Android為此提供了一個方法startActivityForResult(intent,requestCode),這個方法要求活動銷毀時返回資料到上一個Activity,requestCode用來判斷資料的來源,其必須保持唯一性,才可以精確的配對。下面是FirstActivity下點擊事件的代碼:
@Override public void onClick(View view) { Intent intent = new Intent(FirstActivity.this,SecondActivity.class); startActivityForResult(intent,1); }
而在SecondActivity中則需要提供資料相關資訊,並設定自身的“辨識碼”,用來與上一個Activity進行配對使用:
@Override public void onClick(View view) { Intent intent = new Intent(); intent.putExtra("datatrans","來自第二個Activity的資料顯示"); setResult(RESULT_OK,intent); finish(); }
注意到此處的intent只是用來回傳資料,而setResult(結果,intent)方法則是專門來向上一個活動返回資料的,結果表示的是處理結果,一般為RESULT_OK或者RESULT_CANCEL兩種,而intent則是把資料傳遞迴去。
在第一步的startActivityForResult方法來啟動SecondActivity後,當SecondActivity被銷毀時,需要回調FirstActivity中的onActivityResult方法,故需要在FirstActivity中重寫該方法:
@Override public void onActivityResult(int requestCode,int resultCode,Intent data){ switch (requestCode){ case 1: if(resultCode == RESULT_OK){ String data1 = data.getStringExtra("datatrans"); Log.d("FirstActivity",data1); } break; case 2: if (resultCode == RESULT_CANCELED){ String data2 = data.getStringExtra("second"); Log.d("FirstActivity2",data2); } break; case 3: if (resultCode == RESULT_OK){ String data3 = data.getStringExtra("third"); Log.d("FirstActivity",data3); } break; default: } }
上面是自己寫的三種情況下的判斷,實際上若是只有兩個Activity,那麼只需要一個case就可以了。可以看出來,要想回傳資料成功,需要case中匹配,然後是resultCode也需要匹配成功。
可以這樣理解:一封信的寄送與接收,需要信封上的地址與本人的地址(requestCode)一致,而且有時地址一致,但強調姓名(resultCode)也要一致,那麼信封才會送到收件者手中。
在SecondActivity被finish()方法銷毀後,就會調用onActivityResult方法,先是選擇requestCode(即FirstActivity中startActivityForResult中的唯一值),若存在,則根據setResult中的返回狀態值與onActivityResult中的比較,若相同,則直接加以顯示。
在返回資料到上一個活動中,還沒想好怎麼來通俗的比喻,下次再補上。
Android學習之Intent傳遞資料