既然可以傳遞數(shù)據(jù)給下一個活動,那么能不能返回?cái)?shù)據(jù)給上一個活動啦填抬?答案是坑定的。不過不同的是隧期,返回上一個活動只需要按一下Back鍵就可以了飒责,并沒有一個用于啟動活動的Intent來傳遞數(shù)據(jù)。通過查看文檔你會發(fā)現(xiàn)仆潮,Activity中還有一個startActivityForResult()宏蛉;方法來啟動活動的,但是這個個方法期望在活動銷毀的時(shí)候能夠返回一個和結(jié)果給上一個活動性置。毫無疑問拾并,這就是我們所需要的。
startActivityForResult()方法接受兩個參數(shù),第一個參數(shù)耗時(shí)Intent嗅义,第二個參數(shù)是請求碼屏歹,用于在之后的回調(diào)中判斷數(shù)據(jù)的來源,我們還是來實(shí)戰(zhàn)一下之碗,修改FristActivity中按鈕的點(diǎn)擊事件蝙眶,代碼如下所示:
FristActivity ? 中的代碼
這里我們使用了startActivityForResult()方法來啟動Main_two,請求碼只要是一個唯一值就可以了褪那,這里傳入了1,幽纷。接下來我們在Main_two中給按鈕注冊點(diǎn)擊事件,并在點(diǎn)擊事件中添加返回?cái)?shù)據(jù)的邏輯博敬,代碼如下:
Main_two ? Activity中的代碼
可以看到友浸,我們還是構(gòu)建了一個Intent,只不過這個intent僅僅使用與傳遞數(shù)據(jù)而已冶忱,他沒有指定任何的“意圖”尾菇。緊接著把要傳遞的數(shù)據(jù)放在Intent中然后調(diào)用setRestult()方法中接受的兩個參數(shù)境析,第一個參數(shù)用于向上一個活動返回處理結(jié)果們一般只是使用RESULT_OKhe RESULT_CANCLED這兩個值囚枪,第二個參數(shù)吧帶有數(shù)據(jù)的Intent傳遞過去,然后調(diào)用了finish()方法來銷毀當(dāng)前活動劳淆。
? ? ? ? 由于我們使用startActivityForResult()來啟動Main_two (Activity活動)链沼,在Main_two被銷毀之后會回調(diào)上一個活動的onActivityResult()方法,因此我們需要在FristActivity中重寫這個方法來的到返回值的數(shù)據(jù)沛鸵,如下所示:
//在銷毀Main_two之后括勺,在FristActivity中重寫的方法,用于接收Main_two返回回來的數(shù)據(jù)
? ? ? ? ? ? ? ? onActivityResult()方法有三個參數(shù):
?第一個參數(shù) requestCode:
? ? ? ? ? ? ?即我們在啟動活動時(shí)傳入的請求碼曲掰。
?第二個參數(shù)resultCode:
? ? ? ? ? ? ?即我們返回?cái)?shù)據(jù)是處理的結(jié)果疾捍。
?第三個參數(shù)data:
? ? ? ? ? ? ? 及攜帶這返回?cái)?shù)據(jù)的Intent。
? ? ? ? ? ? ? ? ?由于在一個活動中有startActivityForResult()來啟動很多不同的活動栏妖,每一個活動返回的數(shù)據(jù)都會調(diào)用到ActivityResult()這個方法中的乱豆,因此我們首先要做到的就是先檢查requestCode的值來判斷數(shù)據(jù)的來源。確定數(shù)據(jù)是從Main_two返回的之后吊趾,我們再通過resultCode的值來判斷處理結(jié)果是否成功宛裕。最后從data中取值并打印出來,這樣就完成了向上一個活動返回?cái)?shù)據(jù)的工作论泛。
-------------------------------------------------
這個時(shí)候你可能會問揩尸,如果用戶在Main_two中并不是通過點(diǎn)擊按鈕,而是通過按下Back鍵回到FristActivity屁奏,這樣數(shù)據(jù)就沒辦法返回了嗎岩榆?沒錯。不過這種情況還是很好處理的,我們可以通過Mian_two中重寫onBackPressed()方法來解決這個問題朗恳,代碼如下:
Mian_two(Activity)
這樣的話湿颅,當(dāng)用戶按下Back鍵,就會去執(zhí)行onBackPressed()方法中的代碼粥诫,我們在這里添加返回?cái)?shù)據(jù)的邏輯就行了油航。